Spring Security 入门(四):自定义-Filter

前文导读

Spring Security入门(一):登录与退出

Spring Security入门(二):基于数据库验证

Spring Security入门(三):密码加密

Spring Security 入门(四):自定义-Filter_第1张图片

本文解决问题

将自定义的 Filter 加入到 Spring Security 中的 Filter 链中的指定位置。

Spring Security 默认的过滤器链

官网位置:http://docs.spring.io/spring-security/site/docs/5.0.0.M1/reference/htmlsingle/#ns-custom-filters

别名 类名称 Namespace Element or Attribute
CHANNEL_FILTER ChannelProcessingFilter http/intercept-url@requires-channel
SECURITYCONTEXTFILTER SecurityContextPersistenceFilter http
CONCURRENTSESSIONFILTER ConcurrentSessionFilter session-management/concurrency-control
HEADERS_FILTER HeaderWriterFilter http/headers
CSRF_FILTER CsrfFilter http/csrf
LOGOUT_FILTER LogoutFilter http/logout
X509_FILTER X509AuthenticationFilter http/x509
PREAUTHFILTER AbstractPreAuthenticatedProcessingFilter( Subclasses) N/A
CAS_FILTER CasAuthenticationFilter N/A
FORMLOGINFILTER UsernamePasswordAuthenticationFilter http/form-login
BASICAUTHFILTER BasicAuthenticationFilter http/http-basic
SERVLETAPISUPPORT_FILTER SecurityContextHolderAwareRequestFilter http/@servlet-api-provision
JAASAPISUPPORT_FILTER JaasApiIntegrationFilter http/@jaas-api-provision
REMEMBERMEFILTER RememberMeAuthenticationFilter http/remember-me
ANONYMOUS_FILTER AnonymousAuthenticationFilter http/anonymous
SESSIONMANAGEMENTFILTER SessionManagementFilter session-management
EXCEPTIONTRANSLATIONFILTER ExceptionTranslationFilter http
FILTERSECURITYINTERCEPTOR FilterSecurityInterceptor http
SWITCHUSERFILTER SwitchUserFilter N/A

过滤器顺序从上到下

自定义 Filter

自定义的 Filter 建议继承 GenericFilterBean,本文示例:

 
   
  1. public class BeforeLoginFilter extends GenericFilterBean {

  2.    @Override

  3.    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

  4.        System.out.println("This is a filter before UsernamePasswordAuthenticationFilter.");

  5.        // 继续调用 Filter 链

  6.        filterChain.doFilter(servletRequest, servletResponse);

  7.    }

  8. }

配置自定义 Filter 在 Spring Security 过滤器链中的位置

配置很简单,本文示例:

 
   
  1. protected void configure(HttpSecurity http) throws Exception {

  2.        http

  3.                .authorizeRequests()

  4.                .antMatchers("/").permitAll()

  5.                .antMatchers("/user/**").hasRole("USER")

  6.                .and()

  7.                .formLogin().loginPage("/login").defaultSuccessUrl("/user")

  8.                .and()

  9.                .logout().logoutUrl("/logout").logoutSuccessUrl("/login");

  10.        // 在 UsernamePasswordAuthenticationFilter 前添加 BeforeLoginFilter

  11.        http.addFilterBefore(new BeforeLoginFilter(), UsernamePasswordAuthenticationFilter.class);

  12.        // 在 CsrfFilter 后添加 AfterCsrfFilter

  13.        http.addFilterAfter(new AfterCsrfFilter(), CsrfFilter.class);

  14.    }

说明: HttpSecurity 有三个常用方法来配置:

  • addFilterBefore(Filter filter, Class beforeFilter) 在 beforeFilter 之前添加 filter

  • addFilterAfter(Filter filter, Class afterFilter) 在 afterFilter 之后添加 filter

  • addFilterAt(Filter filter, Class atFilter) 在 atFilter 相同位置添加 filter, 此 filter 不覆盖 filter

通过在不同 FilterdoFilter() 方法中加断点调试,可以判断哪个 filter 先执行,从而判断 filter 的执行顺序 。

推荐阅读

如何使用 Spinnaker 和 Kubernetes 进行数据库变更发布?

Netflix 的上线工具 Spinnaker

Dubbo将积极适配Spring Cloud生态

Spring Cloud微服务架构汇总

浅谈微服务基建的逻辑

Service Mesh:下一代微服务

微服务(Microservices)【翻译】

那些没说出口的研发之痛,做与不做微服务的几大理由

谷歌大神为你解释Kubernetes, 微服务和容器化


你可能感兴趣的:(Spring Security 入门(四):自定义-Filter)