6个步骤在你的web应用程序中应用Spring Security

本文介绍了如何通过 Spring Security 实现 Web 应用的权限管理,包括配置 web.xml 文件、设置 Spring 配置文件、定义 web 页面访问权限、对页面元素进行细粒度控制、自定义配置以及对 bean 方法访问权限的控制等关键步骤。
摘要由CSDN通过智能技术生成
  Spring Security是Spring的一个子项目,前身是大名鼎鼎的Acegi。即使是在开源项目众多的Java领域,统一权限管理框架依然是稀缺的,这也是为什么Spring Security(Acegi)已出现就受到热捧的原因。下面我们就来介绍一下怎样应用8个简单的步骤在web应用程序中使用Spring Security。
第一步: 配置web.xml文件
Spring使用由Filter组成的Chain,来判断权限。 所以第一步就是配置web.xml,在web.xml中添加Filter的入口。
  1. <filter>
  2.     <filter-name>springSecurityFilterChain</filter-name>
  3.     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  4. </filter>
  5. <filter-mapping>
  6.     <filter-name>springSecurityFilterChain</filter-name>
  7.     <url-pattern>/*</url-pattern>
  8. </filter-mapping>
  9. <context-param>
  10.     <param-name>contextConfigLocation</param-name>
  11.     <param-value>classpath:spring.xml</param-value>
  12. </context-param>
  13. <listener>
  14.     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  15. </listener>
复制代码


第二步:设置Spring配置文件
首先,我们要设置Spring的bean的命名空间。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans:beansxmlns="http://www.springframework.org/schema/security"
  3. xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  6. http://www.springframework.org/schema/security
  7. http://www.springframework.org/schema/security/spring-security-3.0.xsd">
  8. </beans:beans>
复制代码

然后,我们要配置基本的验证与权限
配置验证与权限的方法我们介绍两种,第一种是直接在配置文件中设置用户验证与权限
  1. <http auto-config="true">
  2.     <intercept-url pattern="/**" access="ROLE_USER" />
  3. </http>
  4. <authentication-manager>
  5.     <authentication-provider>
  6.         <user-service>
  7.             <user name="tom" password="123" authorities="ROLE_USER, ROLE_A" />
  8.             <user name="jerry" password="123" authorities="ROLE_USER, ROLE_B" />
  9.         </user-service>
  10.     </authentication-provider>
  11. </authentication-manager>
复制代码

上面的例子中我们设置了两个用户:tom和jerry。tom具有ROLE_USER,和ROLE_A的权限,jerry具有ROLE_USER和ROLE_B的权限。
第二种是使用数据库配置用户与权限
  1. <authentication-manager>
  2.     <authentication-provider>
  3.         <password-encoder hash=“md5”/>
  4.         <jdbc-user-service data-source-ref="dataSource"/>
  5.     </authentication-provider>
  6. </authentication-manager>
复制代码

具体的数据库的结构请查阅Spring Security的文档,这里就不多说了。

第三步:配置web页面的访问权限
定义了用户和权限之后,我们可以在web页面级别上定义每个页面的访问权限。
  1. <http auto-config="true">
  2.     <intercept-url pattern="/js/**" filters="none"/>
  3.     <intercept-url pattern="/css/**" filters="none"/>
  4.     <intercept-url pattern="/images/**" filters="none"/>
  5.     <intercept-url pattern="/a.jsp" access="ROLE_A" />
  6.     <intercept-url pattern="/b.jsp" access="ROLE_B" />
  7.     <intercept-url pattern="/c.jsp" access="ROLE_A, ROLE_B" />
  8.     <intercept-url pattern="/**" access="ROLE_USER" />
  9. </http>
复制代码


第四步:对web页面进行细粒度控制
上面一步中,我们定义了每个web页面的访问权限。但是,有时我们在同一个页面上的不同的元素也有不同的访问权限,有些元素只有ROLE_A能够访问,有些元素只有ROLE_B能够访问。这个时候我们就需要在web页面元素的级别上定义访问权限。
首先我们需要在web页面上能够获得当前的用户信息,这有两种方法:
方式一:Java代码
  1. Authentication auth = SecurityContextHolder.getContext().getAuthentication();
  2. Collection<GrantedAuthority> col = auth.getAuthorities();
复制代码

方式二:标签库
  1. <%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
  2. <sec:authentication property="name“/>
  3. <sec:authentication property="authorities“/>
复制代码


然后,我可以根据用户的权限来显示不同的内容。
方式一
  1. <sec:authorizeifAnyGranted="ROLE_A">
  2.     <a href="a.jsp">你可以访问a.jsp</a>
  3. </sec:authorize>
  4. <sec:authorizeifNotGranted="ROLE_A">
  5.     你不可以访问a.jsp
  6. </sec:authorize>
复制代码

方式二
  1. <sec:authorizeurl="/a.jsp">
  2.     <a href="a.jsp">你可以访问a.jsp</a>
  3. </sec:authorize>
复制代码


第五步: 自定义Spring Security的配置
我们还可以指定一些自定义的Spring Security的配置信息。
  1. <http auto-config="true">
  2.     <!-- 指定登陆页面、成功页面、失败页面-->
  3.     <form-login login-page="/login.jsp" default-target-url="/index.jsp" authentication-failure-url="/login.jsp" />
  4.     <!-- 尝试访问没有权限的页面时跳转的页面 -->
  5.     <access-denied-handler error-page="/accessDenied.jsp"/>
  6.     <!-- 使用记住用户名、密码功能,指定数据源和加密的key -->
  7.     <remember-me data-source-ref="dataSource" />
  8.     <!-- logout页面,logout后清除session -->
  9.     <logout invalidate-session="true" logout-success-url="/login.jsp" />
  10.     <!-- session 失效后跳转的页面,最大登陆次数 -->
  11.     <session-management invalid-session-url="/sessionTimeout.htm">
  12.         <concurrency-control max-sessions="1" expired-url="/sessionTimeout.htm" />
  13.     </session-management>
  14. </http>
复制代码

第六步:bean的方法访问权限的控制
前面讲的是对web页面的安全设置。Spring Security也可以对bean的方法实行访问权限的控制。有两种方式:
第一种是全局方法安全控制的设置

  1. <global-method-security pre-post-annotations="enabled">
  2.     <protect-pointcut expression="execution(* com.xasxt.*Service.add*(..))" access="ROLE_A"/>
  3.     <protect-pointcut expression="execution(* com.xasxt.*Service.delete*(..))" access="ROLE_B"/>
  4. </global-method-security>
复制代码

此处使用了AspectJ中常用的切入点表达式。上面的配置中,所有匹配com.xasxt.*Service的类的以add开头的方法都只能被ROLE_A访问;所有匹配com.xasxt.*Service的类的以delete开头的方法都只能被ROLE_B访问

第二种是使用注解进行方法安全控制

  1. public class DemoService {
  2.     @PreAuthorize("hasRole('ROLE_A')")
  3.     public void methodA() {
  4.     }

  5.     @PreAuthorize("hasAnyRole('ROLE_A, ROLE_B')")
  6.     public void methodB() {
  7.     }
  8. }
复制代码

hasRole与hasAnyRole为SS通用内置表达式。上面的配置中,methodA只能被ROLE_A访问,methodB能够被ROLE_A或ROLE_B访问。


转自:http://bbs.developersky.net/thread-54-1-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值