自定义securityFilter过滤链

来源:互联网 发布:三国演义总结知乎 编辑:程序博客网 时间:2024/06/06 12:58
spring security3 网上的教程很多,但基本都是大同小异,大部分都是用标签配置,所以找了点时间看了下源码,我用的spring security3.1版本,使用bean声明的方式配置过滤链,看本文章需要读者对spring security3 有一定程度的了解


先来配置下web.xml,HttpSessionEventPublisher是使用session管理时需要用到的


[java] view plaincopy
  1. <!-- spring security -->  
  2.     <filter>  
  3.         <filter-name>securityFilterChainProxy</filter-name>  
  4.         <filter-class>  
  5.             org.springframework.web.filter.DelegatingFilterProxy  
  6.         </filter-class>  
  7.     </filter>  
  8.     <filter-mapping>  
  9.         <filter-name>securityFilterChainProxy</filter-name>  
  10.         <url-pattern>/*</url-pattern>  
  11.     </filter-mapping>  


接着我们要配置一条过滤链(值得注意的是这个bean的id要跟web.xml里配置的filter-name要一致才可以)

[java] view plaincopy
  1. <!-- 自定义SPRING SECURITY过滤链 -->  
  2.     <bean id="securityFilterChainProxy"  
  3.         class="org.springframework.security.web.FilterChainProxy">  
  4.         <constructor-arg>  
  5.             <list>  
  6.                 <security:filter-chain pattern="/services/**"  
  7.                     filters="none" />  
  8.                 <security:filter-chain pattern="/test*" filters="none" />  
  9.                 <security:filter-chain pattern="/**"  
  10.                     filters="concurrentSessionFilter,securityContextPersistenceFilter,logoutFilter,usernamePasswordAuthenticationFilter,rememberMeAuthenticationFilter,sessionManagementFilter,anonymousAuthFilter,exceptionTranslationFilter,filterSecurityInterceptor" />  
  11.             </list>  
  12.         </constructor-arg>  
  13.     </bean>  

下面我们逐个filter来看

首先是filterSecurityInterceptor,这是资源访问第一个要过的filter,至于这里面的属性注入请看我之前的spring security3 自定义权限管理的那篇文章

[java] view plaincopy
  1. <!-- 自定义UserDetailsService认证  -->  
  2.     <bean id="userDetailsService"  
  3.         class="com.shadow.security.service.UserDetailsServiceImpl" />  
  4.   
  5.     <!-- 自定义资源权限关系认证 -->  
  6.     <bean id="accessDecisionManager"  
  7.         class="com.shadow.security.service.AccessDecisionManagerImpl" />  
  8.   
  9.     <!-- 自定义资源权限关系集合 -->  
  10.     <bean id="securityMetadataSource"  
  11.         class="com.shadow.security.service.SecurityMetadataSourceExtendImpl">  
  12.         <property name="matcher" value="ant" />  
  13.     </bean>  
  14.   
  15.     <!-- 自定义认证管理,资源,权限  -->  
  16.     <bean id="filterSecurityInterceptor"  
  17.         class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">  
  18.         <property name="authenticationManager"  
  19.             ref="authenticationManager" />  
  20.         <property name="accessDecisionManager"  
  21.             ref="accessDecisionManager" />  
  22.         <property name="securityMetadataSource"  
  23.             ref="securityMetadataSource" />  
  24.     </bean>  
  25.           
  26.         <!-- 页面标签权限功能依赖 -->  
  27.         <bean id="webInvocationFilter"  
  28.                class="org.springframework.security.web.access.DefaultWebInvocationPrivilegeEvaluator">  
  29.                <constructor-arg ref="filterSecurityInterceptor" />  
  30.         </bean>  


然后是异常捕获的filter,里面有两个属性需要注入,authenticationEntryPoint是配置默认跳转的,accessDeniedHandler是配置当检测无权限访问跳转

[java] view plaincopy
  1. <!-- 异常处理过滤器 -->  
  2.     <bean id="exceptionTranslationFilter"  
  3.         class="org.springframework.security.web.access.ExceptionTranslationFilter">  
  4.         <property name="authenticationEntryPoint"  
  5.             ref="authenticationEntryPoint" />  
  6.         <property name="accessDeniedHandler">  
  7.             <!-- 拒绝未授权访问跳转 -->  
  8.             <bean  
  9.                 class="org.springframework.security.web.access.AccessDeniedHandlerImpl">  
  10.                 <property name="errorPage" value="/error/audit.jsp" />  
  11.             </bean>  
  12.         </property>  
  13.     </bean>  



然后是sessionManagementFilter,这个过滤器配置是否在登录后重新生成一个session防止伪造攻击

[java] view plaincopy
  1. <!-- SESSION固化保护,以及并发控制 -->  
  2. <bean id="sessionManagementFilter"  
  3.     class="org.springframework.security.web.session.SessionManagementFilter">  
  4.     <constructor-arg name="securityContextRepository"  
  5.         ref="securityContextRepository" />  
  6.     <property name="sessionAuthenticationStrategy"  
  7.         ref="concurrentSessionControlStrategy" />  
  8. </bean>  
  9.   
  10. <!-- SESSION并发配置 -->  
  11. <bean id="concurrentSessionControlStrategy"  
  12.     class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy">  
  13.     <constructor-arg name="sessionRegistry" ref="sessionRegistry" />  
  14.     <property name="maximumSessions" value="1" />  
  15.     <property name="exceptionIfMaximumExceeded" value="false" />  
  16. </bean>  
  17.   
  18. <bean id="sessionRegistry"  
  19.     class="org.springframework.security.core.session.SessionRegistryImpl" />  
  20.   
  21. <!-- SESSION并发处理 -->  
  22. <bean id="concurrentSessionFilter"  
  23.     class="org.springframework.security.web.session.ConcurrentSessionFilter">  
  24.     <property name="sessionRegistry" ref="sessionRegistry" />  
  25.     <property name="expiredUrl" value="/error/timeout.jsp" />  
  26.     <property name="logoutHandlers">  
  27.         <list>  
  28.             <ref bean="logoutHandler" />  
  29.         </list>  
  30.     </property>  
  31. </bean>  


然后是rememberMeAuthenticationFilter,这个过滤器主要是配置记住密码功能

[java] view plaincopy
  1. <!-- 记住密码功能(COOKIE方式) -->  
  2.     <bean id="rememberMeAuthenticationFilter"  
  3.         class="org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter">  
  4.         <property name="rememberMeServices" ref="rememberMeServices" />  
  5.         <property name="authenticationManager"  
  6.             ref="authenticationManager" />  
  7.     </bean>  
  8.     <bean id="rememberMeServices"  
  9.         class="org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices">  
  10.         <property name="userDetailsService" ref="userDetailsService" />  
  11.         <property name="parameter" value="rememberMe" />  
  12.         <!-- 默认时间604800秒(一个星期) -->  
  13.         <property name="tokenValiditySeconds" value="604800" />  
  14.         <property name="key" value="springRocks" />  
  15.     </bean>  
  16.     <bean id="rememberMeAuthenticationProvider"  
  17.         class="org.springframework.security.authentication.RememberMeAuthenticationProvider">  
  18.         <property name="key" value="springRocks" />  
  19.     </bean>  


然后是usernamePasswordAuthenticationFilter请参考我之前的spring security3自定义权限管理那篇文章


然后是logoutFilter,这个过滤器主要是做安全注销功能,注入rememberMeServices属性是为了安全退出的时候把记住密码的状态也删除了

[java] view plaincopy
  1. <!-- 注销过滤器 -->  
  2.     <bean id="logoutFilter"  
  3.         class="org.springframework.security.web.authentication.logout.LogoutFilter">  
  4.         <constructor-arg value="/logout.jsp" />  
  5.         <constructor-arg>  
  6.             <array>  
  7.                 <ref bean="logoutHandler" />  
  8.                 <ref bean="rememberMeServices" />  
  9.             </array>  
  10.         </constructor-arg>  
  11.         <property name="filterProcessesUrl" value="/logout" />  
  12.     </bean>  
  13.   
  14.     <!-- 注销监听器  -->  
  15.     <bean id="logoutHandler"  
  16.         class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler">  
  17.     </bean>  


然后是securityContextPersistenceFilter,这个过滤器是为了持久化SecurityContext实例

[java] view plaincopy
  1. <!-- 持久化SecurityContext过滤器 -->  
  2.     <bean id="securityContextPersistenceFilter"  
  3.         class="org.springframework.security.web.context.SecurityContextPersistenceFilter">  
  4.         <property name="securityContextRepository"  
  5.             ref="securityContextRepository" />  
  6.     </bean>  
  7.   
  8.     <!-- 生成HttpSessionSecurityContextRepository -->  
  9.     <bean id="securityContextRepository"  
  10.         class="org.springframework.security.web.context.HttpSessionSecurityContextRepository">  
  11.         <property name="allowSessionCreation" value="true" />  
  12.         <property name="disableUrlRewriting" value="false" />  
  13.     </bean>  


然后是concurrentSessionFilter,这个过滤器是控制session并发问题

[java] view plaincopy
  1. <!-- SESSION并发处理 -->  
  2.     <bean id="concurrentSessionFilter"  
  3.         class="org.springframework.security.web.session.ConcurrentSessionFilter">  
  4.         <property name="sessionRegistry" ref="sessionRegistry" />  
  5.         <property name="expiredUrl" value="/error/timeout.jsp" />  
  6.         <property name="logoutHandlers">  
  7.             <list>  
  8.                 <ref bean="logoutHandler" />  
  9.             </list>  
  10.         </property>  
  11.     </bean>  



然后大致的过滤链就配置好了,对于cas等那些有需要用到的filter就自己看看源码,放到链条里就可以了

1 0
原创粉丝点击