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_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,本文示例:

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 beforeFilter) 在 beforeFilter 之前添加 filter
  • addFilterAfter(Filter filter, Class afterFilter) 在 afterFilter 之后添加 filter
  • addFilterAt(Filter filter, Class atFilter) 在 atFilter 相同位置添加 filter, 此 filter 不覆盖 filter

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

原文发布于微信公众号 - 程序猿DD(didispace)

原文发表时间:2018-01-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏史上最简单的Spring Cloud教程

web的监听器,你需要知道这些...

一、简介 Listener是Servlet规范的另一个高级特性,它用于监听java web程序的事件,例如创建、修改、删除session,request,con...

21550
来自专栏ytkah

DedeCMS后台500错误一种原因是不支持PHP5.3、5.4及以上版本

  我们在迁移网站的时候,可能会出现DedeCMS后台500错误,有可能是因为dedecms不支持PHP5.3、5.4及以上版本,这时我们要改动一些设置才能修复...

34430
来自专栏JavaEdge

Spring Security源码分析之SecurityContextPersistenceFilter

29080
来自专栏JAVA后端开发

spring secutiry密码验证的另一种解决办法(荐)

最近在集成sping security 到spring boot中,看到大部分登陆验证的代码都这么写

29340
来自专栏Java修行之道

使用application作用域实现:当用户重复登录时,挤掉原来的用户

1.application(ServletContext)是保存在服务器端的作用域,我们在application中保存两种形式的键值对:1:<userId, s...

20030
来自专栏JadePeng的技术博客

spring security实现动态配置url权限的两种方法

标准的RABC, 权限需要支持动态配置,spring security默认是在代码里约定好权限,真实的业务场景通常需要可以支持动态配置角色访问权限,即在运行时去...

53700
来自专栏码匠的流水账

聊聊spring security的账户锁定

对于登录功能来说,为了防止暴力破解密码,一般会对登录失败次数进行限定,在一定时间窗口超过一定次数,则锁定账户,来确保系统安全。本文主要讲述一下spring se...

25920
来自专栏JadePeng的技术博客

Spring Security 架构与源码分析

Spring Security 主要实现了Authentication(认证,解决who are you? ) 和 Access Control(访问控制,也就...

14100
来自专栏JavaEdge

Spring Security权限框架理论与实战(二)-常用权限拦截器1 SecurityContextPersistenceFilter

通过观察Filter的名字,就能大概猜出来这个过滤器的作用,持久化SecurityContext实例 org.springframework.security...

20920
来自专栏程序猿DD

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

前言 Spring Security 比较复杂,愿与各位一起研究使用,有歧义的地方,欢迎指出,谢谢! ? Github 地址 https://github.co...

57550

扫码关注云+社区

领取腾讯云代金券