美文网首页Learn Spring Boot Spring BootJava学习笔记
Spring Security 入门:自定义 Filter

Spring Security 入门:自定义 Filter

作者: Anoyi | 来源:发表于2017-06-13 10:25 被阅读5138次

    本文解决问题

    将自定义的 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
    SECURITY_CONTEXT_FILTER SecurityContextPersistenceFilter http
    CONCURRENT_SESSION_FILTER 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
    PRE_AUTH_FILTER AbstractPreAuthenticatedProcessingFilter( Subclasses) N/A
    CAS_FILTER CasAuthenticationFilter N/A
    FORM_LOGIN_FILTER UsernamePasswordAuthenticationFilter http/form-login
    BASIC_AUTH_FILTER BasicAuthenticationFilter http/http-basic
    SERVLET_API_SUPPORT_FILTER SecurityContextHolderAwareRequestFilter http/@servlet-api-provision
    JAAS_API_SUPPORT_FILTER JaasApiIntegrationFilter http/@jaas-api-provision
    REMEMBER_ME_FILTER RememberMeAuthenticationFilter http/remember-me
    ANONYMOUS_FILTER AnonymousAuthenticationFilter http/anonymous
    SESSION_MANAGEMENT_FILTER SessionManagementFilter session-management
    EXCEPTION_TRANSLATION_FILTER ExceptionTranslationFilter http
    FILTER_SECURITY_INTERCEPTOR FilterSecurityInterceptor http
    SWITCH_USER_FILTER SwitchUserFilter N/A

    过滤器顺序从上到下

    自定义 Filter

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

    public class BeforeLoginFilter extends GenericFilterBean {
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("This is a filter before UsernamePasswordAuthenticationFilter.");
            // 继续调用 Filter 链
            filterChain.doFilter(servletRequest, servletResponse);
        }
    }
    

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

    配置很简单,本文示例:

    protected void configure(HttpSecurity http) throws Exception {
            http
                    .authorizeRequests()
                    .antMatchers("/").permitAll()
                    .antMatchers("/user/**").hasRole("USER")
                    .and()
                    .formLogin().loginPage("/login").defaultSuccessUrl("/user")
                    .and()
                    .logout().logoutUrl("/logout").logoutSuccessUrl("/login");
    
            // 在 UsernamePasswordAuthenticationFilter 前添加 BeforeLoginFilter
            http.addFilterBefore(new BeforeLoginFilter(), UsernamePasswordAuthenticationFilter.class);
    
            // 在 CsrfFilter 后添加 AfterCsrfFilter
            http.addFilterAfter(new AfterCsrfFilter(), CsrfFilter.class);
        }
    

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

    • addFilterBefore(Filter filter, Class<? extends Filter> beforeFilter)
      在 beforeFilter 之前添加 filter
    • addFilterAfter(Filter filter, Class<? extends Filter> afterFilter)
      在 afterFilter 之后添加 filter
    • addFilterAt(Filter filter, Class<? extends Filter> atFilter)
      在 atFilter 相同位置添加 filter, 此 filter 不覆盖 filter

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

    相关文章

      网友评论

      • 5f1c59c591f1:有个问题:若该拦截器是自定义的认证拦截器,那么访问 / 时会进入自定义的认证拦截器,怎么办?
        5f1c59c591f1:@Anoyi http
        .authorizeRequests()
        .antMatchers("/").permitAll() 这样的意思是运行访问 / 不需要认证就能访问,但是当你自定义认证拦截器时,该认证拦截器会拦截 / 请求,导致/ 访问不了
        Anoyi:@小智_cc77 filter 是链,会按照一定的顺序往下执行
      • 218f7aea3ad0:addFilterAt(Filter filter, Class<? extends Filter> atFilter)
        在 atFilter 相同位置添加 filter, 此 filter 不覆盖 filter

        不懂,既然不覆盖,那原Filter和当前Filter执行顺序是什么?有什么依据吗?
        Anoyi:@Kyrie2Carry 在两个Filter的dofilter方法上打断点
      • 次郎:……addFiliterAt是不是不好用?……
        次郎:@Anoyi ……不,我的意思是,使用这个方法并没有实际替换掉安全链……
        Anoyi:@次郎 看具体场景吧
      • 血色孤狼:什么时候能出一个基于springboot springsecurity的权限呢:grin:,期待......
        Anoyi:@血色孤狼 先看呗,一起学
        血色孤狼:@Anoyi 我是想等你写完一起看:grin:
        Anoyi:@血色孤狼 全是基于spring boot的,你没看代码吧:joy:

      本文标题:Spring Security 入门:自定义 Filter

      本文链接:https://www.haomeiwen.com/subject/sezlqxtx.html