博客园
个人中心
三、Spring Boot集成Spring Security之securityFilterChain过滤器链详解
2024-10-12 11:29:18 发布
57 浏览
页面报错/反馈
已
收藏
点赞
二、默认过滤器链
1、默认配置系统启动日志
2、默认配置的过滤器及顺序如下
org.springframework.security.web.session.DisableEncodeUrlFilter
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter
org.springframework.security.web.context.SecurityContextPersistenceFilter
org.springframework.security.web.header.HeaderWriterFilter
org.springframework.security.web.csrf.CsrfFilter
org.springframework.security.web.authentication.logout.LogoutFilter
org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter
org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter
org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter
org.springframework.security.web.authentication.www.BasicAuthenticationFilter
org.springframework.security.web.savedrequest.RequestCacheAwareFilter
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter
org.springframework.security.web.authentication.AnonymousAuthenticationFilter
org.springframework.security.web.session.SessionManagementFilter
org.springframework.security.web.access.ExceptionTranslationFilter
org.springframework.security.web.access.intercept.FilterSecurityInterceptor
3、本文只介绍和登录相关的过滤器
SecurityContextPersistenceFilter
LogoutFilter
UsernamePasswordAuthenticationFilter
DefaultLoginPageGeneratingFilter
DefaultLogoutPageGeneratingFilter
AnonymousAuthenticationFilter
ExceptionTranslationFilter
FilterSecurityInterceptor
三、登录重要概念介绍
安全上下文仓库(SecurityContextRepository):用于存储安全上下文,默认基于session实现(HttpSessionSecurityContextRepository)
安全上下文持有者(SecurityContextHolder):用于存储本次请求的安全上下文,默认基于ThreadLocal实现
安全上下文(SecurityContext):用于存储认证信息
认证信息(Authentication):用于存储用户及认证结果信息,主要实现类有
用户名密码认证Token:UsernamePasswordAuthenticationToken
匿名认证Token:AnonymousAuthenticationToken
登录页面请求:跳转到登录页面的请求
登录请求:在登录页面输入用户名密码后提交的请求
登出页面请求:跳转到登出页面的请求
登出请求:在登出页面确认登出提交的请求
过滤器介绍
过滤器的入口为doFilter(ServletRequest request, ServletResponse response, FilterChain chain)方法
过滤器主要分为三部分:chain.doFilter之前代码,chain.doFilter,chain.doFilter之后的代码
chain.doFilter之前的代码按照过滤器链顺序执行
chain.doFilter之后的代码按照过滤器链倒序执行
调用chain.doFilter表示执行后续的过滤器;不调用chain.doFilter表示不执行后续的过滤器,会按过滤器链倒序执行已经调用的过滤器chain.doFilter之后的代码,这点很重要,下面在介绍每个过滤器时不再赘述。
四、SecurityContextPersistenceFilter
1、实现功能
登录成功之后的身份认证
2、处理请求类型
所有请求
3、是否会终止过滤器链
不会
4、实现步骤
从安全上下文仓库中获取安全上下文,如果为空则创建没有认证信息的安全上下文
将安全上下文设置到安全上下文持有者中供后续业务使用
调用后续过滤器链
从安全上下文持有者中获取最新的认证信息
清除安全上下文持有者中的认证信息
将步骤4中的认证信息添加到安全上下文仓库中
5、关键源码
五、LogoutFilter
1、实现功能
清除认证信息
重定向登录页面
2、处理请求类型
登出请求(默认:POST、/logout请求)
3、是否会终止过滤器链
登出请求时会终止
4、实现步骤
匹配请求地址
清除认证信息(CompositeLogoutHandler中注册的LogoutHandler实现类)
调用登出成功处理器,默认SimpleUrlLogoutSuccessHandler实现重定向登录页面功能,推荐自定义配置,后续介绍
5、关键源码
六、UsernamePasswordAuthenticationFilter
1、实现功能
使用提交的用户名密码生成用户名密码认证Token
根据认证结果做不同处理
2、处理请求类型
登录请求(默认:POST、/login请求)
3、是否会终止过滤器链
认证失败时会终止过滤器链,重定向默认登录地址
认证成功时会终止过滤器链,重定向到目标URL地址
4、实现步骤
匹配请求地址
默认配置:提交的用户名密码和内存中用户名密码匹配,并校验用户和密码的是否有效等信息
认证失败时重定向到登录页面
认证成功时将已认证的安全上下文设置到安全上下文持有者中
重定向到目标URL地址(未认证访问目标地址,会先重定向登录页面,登录成功后再重定向到目标URL地址)
5、关键源码
七、DefaultLoginPageGeneratingFilter
1、实现功能
生成默认登录页面
2、处理请求类型
登录页面请求(默认GET、/login请求)
登录失败
登出成功
3、是否会终止过滤器链
登录页面请求、登录失败、登出成功时会终止过滤器链
4、关键源码
八、DefaultLogoutPageGeneratingFilter
1、实现功能
生成默认登出页面
2、处理请求类型
登出页面请求(默认:GET、/logout请求)
3、是否会终止过滤器链
登出页面请求时会终止过滤器链
4、关键源码
九、AnonymousAuthenticationFilter
1、实现功能
当前认证信息为空时生成匿名认证信息
2、处理请求类型
所有请求
3、是否会终止过滤器链
不会
4、关键源码
十、ExceptionTranslationFilter
1、实现功能
处理FilterSecurityInterceptor抛出的异常,根据异常做相应处理
2、处理请求类型
所有请求
3、是否会终止过滤器链
认证失败时会重定向登录页面
授权失败时会返回错误信息
4、关键源码
十一、FilterSecurityInterceptor
1、实现功能
认证和授权
2、处理请求类型
所有请求
3、是否会终止过滤器链
认证或授权失败会抛出异常由ExceptionTranslationFilter处理该异常
4、关键源码
登录
查看全部
参与评论
昵称
登录
发布评论
评论留言
还没有评论留言,赶紧来抢楼吧~~
手机查看
返回顶部
给这篇文章打个标签吧~
棒极了
糟糕透顶
好文章
PHP
JAVA
JS
小程序
Python
SEO
MySql
确认