自定义securityFilter过滤链

spring security3 网上的教程很多,但基本都是大同小异,大部分都是用标签配置,所以找了点时间看了下源码,我用的spring security3.1版本,使用bean声明的方式配置过滤链,看本文章需要读者对spring security3 有一定程度的了解


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


[java]  view plain copy
  1.   
  2.       
  3.         securityFilterChainProxy  
  4.         class>  
  5.             org.springframework.web.filter.DelegatingFilterProxy  
  6.         class>  
  7.       
  8.       
  9.         securityFilterChainProxy  
  10.         /*  
  11.       


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

[java]  view plain copy
  1.   
  2.     "securityFilterChainProxy"  
  3.         class="org.springframework.security.web.FilterChainProxy">  
  4.           
  5.               
  6.                 "/services/**"  
  7.                     filters="none" />  
  8.                 "/test*" filters="none" />  
  9.                 "/**"  
  10.                     filters="concurrentSessionFilter,securityContextPersistenceFilter,logoutFilter,usernamePasswordAuthenticationFilter,rememberMeAuthenticationFilter,sessionManagementFilter,anonymousAuthFilter,exceptionTranslationFilter,filterSecurityInterceptor" />  
  11.               
  12.           
  13.       

下面我们逐个filter来看

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

[java]  view plain copy
  1.   
  2.     "userDetailsService"  
  3.         class="com.shadow.security.service.UserDetailsServiceImpl" />  
  4.   
  5.       
  6.     "accessDecisionManager"  
  7.         class="com.shadow.security.service.AccessDecisionManagerImpl" />  
  8.   
  9.       
  10.     "securityMetadataSource"  
  11.         class="com.shadow.security.service.SecurityMetadataSourceExtendImpl">  
  12.         "matcher" value="ant" />  
  13.       
  14.   
  15.       
  16.     "filterSecurityInterceptor"  
  17.         class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">  
  18.         "authenticationManager"  
  19.             ref="authenticationManager" />  
  20.         "accessDecisionManager"  
  21.             ref="accessDecisionManager" />  
  22.         "securityMetadataSource"  
  23.             ref="securityMetadataSource" />  
  24.       
  25.           
  26.           
  27.         "webInvocationFilter"  
  28.                class="org.springframework.security.web.access.DefaultWebInvocationPrivilegeEvaluator">  
  29.                "filterSecurityInterceptor" />  
  30.           


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

[java]  view plain copy
  1.   
  2.     "exceptionTranslationFilter"  
  3.         class="org.springframework.security.web.access.ExceptionTranslationFilter">  
  4.         "authenticationEntryPoint"  
  5.             ref="authenticationEntryPoint" />  
  6.         "accessDeniedHandler">  
  7.               
  8.             
  9.                 class="org.springframework.security.web.access.AccessDeniedHandlerImpl">  
  10.                 "errorPage" value="/error/audit.jsp" />  
  11.               
  12.           
  13.       



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

[java]  view plain copy
  1.   
  2. "sessionManagementFilter"  
  3.     class="org.springframework.security.web.session.SessionManagementFilter">  
  4.     "securityContextRepository"  
  5.         ref="securityContextRepository" />  
  6.     "sessionAuthenticationStrategy"  
  7.         ref="concurrentSessionControlStrategy" />  
  8.   
  9.   
  10.   
  11. "concurrentSessionControlStrategy"  
  12.     class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy">  
  13.     "sessionRegistry" ref="sessionRegistry" />  
  14.     "maximumSessions" value="1" />  
  15.     "exceptionIfMaximumExceeded" value="false" />  
  16.   
  17.   
  18. "sessionRegistry"  
  19.     class="org.springframework.security.core.session.SessionRegistryImpl" />  
  20.   
  21.   
  22. "concurrentSessionFilter"  
  23.     class="org.springframework.security.web.session.ConcurrentSessionFilter">  
  24.     "sessionRegistry" ref="sessionRegistry" />  
  25.     "expiredUrl" value="/error/timeout.jsp" />  
  26.     "logoutHandlers">  
  27.           
  28.             "logoutHandler" />  
  29.           
  30.       
  31.   


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

[java]  view plain copy
  1.   
  2.     "rememberMeAuthenticationFilter"  
  3.         class="org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter">  
  4.         "rememberMeServices" ref="rememberMeServices" />  
  5.         "authenticationManager"  
  6.             ref="authenticationManager" />  
  7.       
  8.     "rememberMeServices"  
  9.         class="org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices">  
  10.         "userDetailsService" ref="userDetailsService" />  
  11.         "parameter" value="rememberMe" />  
  12.           
  13.         "tokenValiditySeconds" value="604800" />  
  14.         "key" value="springRocks" />  
  15.       
  16.     "rememberMeAuthenticationProvider"  
  17.         class="org.springframework.security.authentication.RememberMeAuthenticationProvider">  
  18.         "key" value="springRocks" />  
  19.       


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


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

[java]  view plain copy
  1.   
  2.     "logoutFilter"  
  3.         class="org.springframework.security.web.authentication.logout.LogoutFilter">  
  4.         "/logout.jsp" />  
  5.           
  6.               
  7.                 "logoutHandler" />  
  8.                 "rememberMeServices" />  
  9.               
  10.           
  11.         "filterProcessesUrl" value="/logout" />  
  12.       
  13.   
  14.       
  15.     "logoutHandler"  
  16.         class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler">  
  17.       


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

[java]  view plain copy
  1.   
  2.     "securityContextPersistenceFilter"  
  3.         class="org.springframework.security.web.context.SecurityContextPersistenceFilter">  
  4.         "securityContextRepository"  
  5.             ref="securityContextRepository" />  
  6.       
  7.   
  8.       
  9.     "securityContextRepository"  
  10.         class="org.springframework.security.web.context.HttpSessionSecurityContextRepository">  
  11.         "allowSessionCreation" value="true" />  
  12.         "disableUrlRewriting" value="false" />  
  13.       


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

[java]  view plain copy
  1.   
  2.     "concurrentSessionFilter"  
  3.         class="org.springframework.security.web.session.ConcurrentSessionFilter">  
  4.         "sessionRegistry" ref="sessionRegistry" />  
  5.         "expiredUrl" value="/error/timeout.jsp" />  
  6.         "logoutHandlers">  
  7.               
  8.                 "logoutHandler" />  
  9.               
  10.           
  11.       



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

你可能感兴趣的:(spring学习)