运用spring security 首先应该在web.xml里加入一个过滤器
?
<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>
? ? ?我们添加了一个过滤器,他是调用Spring Security的入口。
DelegatingFilterProxy代表一个filter,这个filter其实是spring容器中的一个bean。例如上面的例子,那么Spring容器中就会有一个名为“springSecurityFilterChain”的bean。 这个bean是通过spring security标签创建的,负责处理web 安全。
? ? ?添加完上面的代码,接下来需要在spring的配置文件中运用<http>标签来配置spring security的业务。
?
<sec:http auto-config="true"> <sec:intercept-url pattern="/**" access="ROLE_USER"/> </sec:http>
? ? ?这段代码的意思是说,我们希望所有进入wen应用的连接都需要安全验证。并且只有是“ROLE_USER”角色的用户可以访问。<http>标签是root标签。<intercept-url>是<http>的子标签。<intercept-url>标签中有一个"pattern"属性,通过它的值来匹配进入web应用的连接请求。<intercept-url>标签中的access属性的值为访问控制限制。
?
? ? ?直接在配置文件里定义测试数据
?
<sec:authentication-manager> <sec:authentication-provider> <sec:user-service> <sec:user name="aaa" password="AAA" authorities="ROLE_USER,ROLE_ADMIN"/> <sec:user name="bbb" password="BBB" authorities="ROLE_USER"/> </sec:user-service> </sec:authentication-provider> </sec:authentication-manager>
? ? ?定义了两个用户分别是 aaa 和 bbb。也可以通过<sec:user-service>标签中的"properties"属性从一个properties文件中加载用户的信息。
? ? ?<authentication-provider>标签的作用指出定义的用户信息将会被authentication Manager使用,别且来处理认证请求。
? ? ?配置完这些就可以启动web应用,做登录请求了。上面的配置其实已经添加了一些安全业务处理,因为运用"auto-config"属性,例如简单的登录处理。
? ? ?auto-config 自动配置了一些设置,包括默认的登录界面、认证处理等。
?
<http auto-config='true'> <intercept-url pattern="/**" access="ROLE_USER" /> </http>
? ? ? 上面的代码片段与下面的含义是一样的
?
<intercept-url pattern="/**" access="ROLE_USER"/>
<form-login />
<http-basic />
<logout />
</http>
?
? ? ?从上面的配置,我们不知道应该从哪个页面执行登录操作,没有提及任何html或JSP等页面。其实我们不需要指出一个具体的URL作为登录界面。Spring Security会自动生成一个登录界面。
? ? ?如果想任务请求都不受安全限制的话,可以把access的值设置成“IS_AUTHENTICATED_ANONYMOUSLY”,则请求将被安全机制忽视
? ??<form-login>标签的属性
- login-page:指向自定义的登录界面URL。
- default-target-url:登录后跳转的页面URL。
- always-use-default-target:登录后跳转的URL是否可用
<sec:form-login login-page="/login.jsp" default-target-url="/doahbord" always-use-default-target='true'/>
? ? ? 应用其他的“Authentication Providers”
? ? ?authentication provider作用是将用户信息提供给 authentication manager进行用户认证的。有些时候我们需要更详细的用户信息,那么上面通过在配置文件中定义用户内容就不能满足我们要求。而且用户的信息存储不光只在配置文件中,用户信息可以存储在数据库或者LDAP Server中等。可以通过自定义一个实现接口“UserDetaislService”的类。例如:
?
<authentication-manager> <authentication-provider user-service-ref='myUserDetailsService'/> </authentication-manager>
? ?上面的例子 “myUserDetailsService”是我们自定义的一个类。他负责将用户信息封装成UserDetails类。
?
? ?如果用户的信息是存储在数据库中,那么可以用下面的配置
?
<authentication-manager> <authentication-provider> <jdbc-user-service data-source-ref="securityDataSource"/> </authentication-provider> </authentication-manager>
? ? “securityDataSource”是一个DataSource类型的bean。这个bean指向数据库,并且数据库中有标准的spring security用户tables。具体表结构可以通过spring官网查询。
?
? ?会话控制 session management
? ? 检测session超时
? ? 可以通过配置检测session超时并且将请求冲定向一个适当的URL。可以在配置文件里进行如下配置实现该功能
?
<http> ... <session-management invalid-session-url="/invalidSession.htm" /> </http>
? ? 上面配置的session超时检测有些时候会报出一些不恰当的异常。例如当一个用户注销后又重新登录,但是整个过程没有关闭游览器,这是因为游览器的cookie中仍然存储着这个被废除的session。可以通过配置当注销的时候删除cookie中的session。如下:
?
<http> <logout delete-cookies="JSESSIONID" /> </http>
? ?单点登录控制
? ? 如果你想应用支持单点登录,那么要在spring security框架外部做一些简单配置。
? ? 首先要在web.xml里面加入一个listener
?
<listener> <listener-class> org.springframework.security.web.session.HttpSessionEventPublisher </listener-class> </listener>
? ? 然后再spring配置文件中加入下面代码
?
<http> ... <session-management> <concurrency-control max-sessions="1" /> </session-management> </http>
? ? 这样就可以防止一个用户多次登录(用户第二次登录将会导致第一次登录会话失效)。如果想防止第二次登录可以做如下配 ? ? 置,那么第二次登录就会失败,不会导致第一次登录的会话失效
?
<http> ... <session-management> <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" /> </session-management> </http>
? ? 上面的配置会导致第二次会话被拒绝,如果是通过form-login的形式登录的话,那么请求就会被转发到认证失败的页面
?
?
? ? 认证管理组件
? ? AuthenticationManager是spring security认证服务的主要接口。它通常是ProviderManager类的一个实例。AuthenticationManager是通过<authentication-manager>标签被注册到spring容器中的。
? ? AuthenticationManager通常是与AuthenticationProvider结合一起使用的。AuthenticationProvider可以通过<authentication-provider>标签注册到spring 容器中。代码如下
?
<authentication-manager> <authentication-provider ref="casAuthenticationProvider"/> </authentication-manager> <bean id="casAuthenticationProvider" class="org.springframework.security.cas.authentication.CasAuthenticationProvider"> ... </bean>