Spring Security是Spring的一个子项目,前身是大名鼎鼎的Acegi。即使是在开源项目众多的Java领域,统一权限管理框架依然是稀缺的,这也是为什么Spring Security(Acegi)已出现就受到热捧的原因。下面我们就来介绍一下怎样应用8个简单的步骤在web应用程序中使用Spring Security。
第一步: 配置web.xml文件
Spring使用由Filter组成的Chain,来判断权限。 所以第一步就是配置web.xml,在web.xml中添加Filter的入口。
- <filter>
- <filter-name>springSecurityFilterChain</filter-name>
- <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>springSecurityFilterChain</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:spring.xml</param-value>
- </context-param>
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
复制代码
第二步:设置Spring配置文件
首先,我们要设置Spring的bean的命名空间。
- <?xml version="1.0" encoding="UTF-8"?>
- <beans:beansxmlns="http://www.springframework.org/schema/security"
- xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/security
- http://www.springframework.org/schema/security/spring-security-3.0.xsd">
- </beans:beans>
复制代码
然后,我们要配置基本的验证与权限
配置验证与权限的方法我们介绍两种,第一种是直接在配置文件中设置用户验证与权限
- <http auto-config="true">
- <intercept-url pattern="/**" access="ROLE_USER" />
- </http>
- <authentication-manager>
- <authentication-provider>
- <user-service>
- <user name="tom" password="123" authorities="ROLE_USER, ROLE_A" />
- <user name="jerry" password="123" authorities="ROLE_USER, ROLE_B" />
- </user-service>
- </authentication-provider>
- </authentication-manager>
复制代码
上面的例子中我们设置了两个用户:tom和jerry。tom具有ROLE_USER,和ROLE_A的权限,jerry具有ROLE_USER和ROLE_B的权限。
第二种是使用数据库配置用户与权限
- <authentication-manager>
- <authentication-provider>
- <password-encoder hash=“md5”/>
- <jdbc-user-service data-source-ref="dataSource"/>
- </authentication-provider>
- </authentication-manager>
复制代码
具体的数据库的结构请查阅Spring Security的文档,这里就不多说了。
第三步:配置web页面的访问权限
定义了用户和权限之后,我们可以在web页面级别上定义每个页面的访问权限。
- <http auto-config="true">
- <intercept-url pattern="/js/**" filters="none"/>
- <intercept-url pattern="/css/**" filters="none"/>
- <intercept-url pattern="/images/**" filters="none"/>
- <intercept-url pattern="/a.jsp" access="ROLE_A" />
- <intercept-url pattern="/b.jsp" access="ROLE_B" />
- <intercept-url pattern="/c.jsp" access="ROLE_A, ROLE_B" />
- <intercept-url pattern="/**" access="ROLE_USER" />
- </http>
复制代码
第四步:对web页面进行细粒度控制
上面一步中,我们定义了每个web页面的访问权限。但是,有时我们在同一个页面上的不同的元素也有不同的访问权限,有些元素只有ROLE_A能够访问,有些元素只有ROLE_B能够访问。这个时候我们就需要在web页面元素的级别上定义访问权限。
首先我们需要在web页面上能够获得当前的用户信息,这有两种方法:
方式一:Java代码
- Authentication auth = SecurityContextHolder.getContext().getAuthentication();
- Collection<GrantedAuthority> col = auth.getAuthorities();
复制代码
方式二:标签库
- <%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
- <sec:authentication property="name“/>
- <sec:authentication property="authorities“/>
复制代码
然后,我可以根据用户的权限来显示不同的内容。
方式一
- <sec:authorizeifAnyGranted="ROLE_A">
- <a href="a.jsp">你可以访问a.jsp</a>
- </sec:authorize>
- <sec:authorizeifNotGranted="ROLE_A">
- 你不可以访问a.jsp
- </sec:authorize>
复制代码
方式二
- <sec:authorizeurl="/a.jsp">
- <a href="a.jsp">你可以访问a.jsp</a>
- </sec:authorize>
复制代码
第五步: 自定义Spring Security的配置
我们还可以指定一些自定义的Spring Security的配置信息。
- <http auto-config="true">
- <!-- 指定登陆页面、成功页面、失败页面-->
- <form-login login-page="/login.jsp" default-target-url="/index.jsp" authentication-failure-url="/login.jsp" />
- <!-- 尝试访问没有权限的页面时跳转的页面 -->
- <access-denied-handler error-page="/accessDenied.jsp"/>
- <!-- 使用记住用户名、密码功能,指定数据源和加密的key -->
- <remember-me data-source-ref="dataSource" />
- <!-- logout页面,logout后清除session -->
- <logout invalidate-session="true" logout-success-url="/login.jsp" />
- <!-- session 失效后跳转的页面,最大登陆次数 -->
- <session-management invalid-session-url="/sessionTimeout.htm">
- <concurrency-control max-sessions="1" expired-url="/sessionTimeout.htm" />
- </session-management>
- </http>
复制代码
第六步:bean的方法访问权限的控制
前面讲的是对web页面的安全设置。Spring Security也可以对bean的方法实行访问权限的控制。有两种方式:
第一种是全局方法安全控制的设置
- <global-method-security pre-post-annotations="enabled">
- <protect-pointcut expression="execution(* com.xasxt.*Service.add*(..))" access="ROLE_A"/>
- <protect-pointcut expression="execution(* com.xasxt.*Service.delete*(..))" access="ROLE_B"/>
- </global-method-security>
复制代码
此处使用了AspectJ中常用的切入点表达式。上面的配置中,所有匹配com.xasxt.*Service的类的以add开头的方法都只能被ROLE_A访问;所有匹配com.xasxt.*Service的类的以delete开头的方法都只能被ROLE_B访问
第二种是使用注解进行方法安全控制
- public class DemoService {
- @PreAuthorize("hasRole('ROLE_A')")
- public void methodA() {
- }
- @PreAuthorize("hasAnyRole('ROLE_A, ROLE_B')")
- public void methodB() {
- }
- }
复制代码
hasRole与hasAnyRole为SS通用内置表达式。上面的配置中,methodA只能被ROLE_A访问,methodB能够被ROLE_A或ROLE_B访问。
转自:http://bbs.developersky.net/thread-54-1-1.html