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

前文导读

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

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

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

本文解决问题

将自定义的 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_FILTERChannelProcessingFilterhttp/intercept-url@requires-channel
SECURITYCONTEXTFILTERSecurityContextPersistenceFilterhttp
CONCURRENTSESSIONFILTERConcurrentSessionFiltersession-management/concurrency-control
HEADERS_FILTERHeaderWriterFilterhttp/headers
CSRF_FILTERCsrfFilterhttp/csrf
LOGOUT_FILTERLogoutFilterhttp/logout
X509_FILTERX509AuthenticationFilterhttp/x509
PREAUTHFILTERAbstractPreAuthenticatedProcessingFilter( Subclasses)N/A
CAS_FILTERCasAuthenticationFilterN/A
FORMLOGINFILTERUsernamePasswordAuthenticationFilterhttp/form-login
BASICAUTHFILTERBasicAuthenticationFilterhttp/http-basic
SERVLETAPISUPPORT_FILTERSecurityContextHolderAwareRequestFilterhttp/@servlet-api-provision
JAASAPISUPPORT_FILTERJaasApiIntegrationFilterhttp/@jaas-api-provision
REMEMBERMEFILTERRememberMeAuthenticationFilterhttp/remember-me
ANONYMOUS_FILTERAnonymousAuthenticationFilterhttp/anonymous
SESSIONMANAGEMENTFILTERSessionManagementFiltersession-management
EXCEPTIONTRANSLATIONFILTERExceptionTranslationFilterhttp
FILTERSECURITYINTERCEPTORFilterSecurityInterceptorhttp
SWITCHUSERFILTERSwitchUserFilterN/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, 微服务和容器化


  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值