三、Spring Boot集成Spring Security之securityFilterChain过滤器链详解
二、默认过滤器链
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、关键源码

三、Spring Boot集成Spring Security之securityFilterChain过滤器链详解的更多相关文章
- Spring Boot集成Spring Data Reids和Spring Session实现Session共享
首先,需要先集成Redis的支持,参考:http://www.cnblogs.com/EasonJim/p/7805665.html Spring Boot集成Spring Data Redis+Sp ...
- SpringBoot系列:Spring Boot集成Spring Cache,使用EhCache
前面的章节,讲解了Spring Boot集成Spring Cache,Spring Cache已经完成了多种Cache的实现,包括EhCache.RedisCache.ConcurrentMapCac ...
- SpringBoot系列:Spring Boot集成Spring Cache,使用RedisCache
前面的章节,讲解了Spring Boot集成Spring Cache,Spring Cache已经完成了多种Cache的实现,包括EhCache.RedisCache.ConcurrentMapCac ...
- Spring Boot 集成 Spring Security 实现权限认证模块
作者:王帅@CodeSheep 写在前面 关于 Spring Security Web系统的认证和权限模块也算是一个系统的基础设施了,几乎任何的互联网服务都会涉及到这方面的要求.在Java EE领 ...
- Spring boot 集成Spring Security
依赖jar <dependency> <groupId>org.springframework.cloud</groupId> <artifactId> ...
- Spring Boot 集成spring security4
项目GitHub地址 : https://github.com/FrameReserve/TrainingBoot Spring Boot (三)集成spring security,标记地址: htt ...
- Spring boot集成spring session实现session共享
最近使用spring boot开发一个系统,nginx做负载均衡分发请求到多个tomcat,此时访问页面会把请求分发到不同的服务器,session是存在服务器端,如果首次访问被分发到A服务器,那么se ...
- Spring Boot教程(十六)属性配置文件详解(1)
相信很多人选择Spring Boot主要是考虑到它既能兼顾Spring的强大功能,还能实现快速开发的便捷.我们在Spring Boot使用过程中,最直观的感受就是没有了原来自己整合Spring应用时繁 ...
- Spring Boot 集成 Spring Security
1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- Spring Boot 集成 Spring Security 入门案例教程
前言 本文作为入门级的DEMO,完全按照官网实例演示: 项目目录结构 Maven 依赖 <parent> <groupId>org.springframework.boot&l ...
随机推荐
- 【Mybatis】09 日志工厂配置 & Log4J
什么是日志 Log? 系统日志是记录系统中硬件.软件和系统问题的信息,同时还可以监视系统中发生的事件. 用户可以通过它来检查错误发生的原因,或者寻找受到攻击时攻击者留下的痕迹. 系统日志包括系统日志. ...
- OpenAI内讧更多细节曝光:奥特曼离间董事会失败
参考: https://www.thepaper.cn/newsDetail_forward_25512687 ============================== 根据 https://ww ...
- 为baselines算法库安装mujoco环境支持——ubuntu 20.04安装MuJoCo2.1.1
下载开源版本的mujoco二进制文件: wget https://github.com/deepmind/mujoco/releases/download/2.1.1/mujoco-2.1.1-lin ...
- 最新版gym-0.26.2中Atari环境下各游戏在不同模式和困难度下的遍历
相关内容参看前文: 最新版gym-0.26.2下Atari环境的安装以及环境版本v0,v4,v5的说明 =========================================== gym中 ...
- 面试题:写一个遍历ArrayList的时候,删除一个元素的例子?并说说原理。
代码实现 方法一:for循环 public static void main(String[] args) { ArrayList<String> list = new ArrayList ...
- python分布式事务方案(二)基于消息最终一致性
荐
python分布式事务方案(二)基于消息最终一致性 上一章采用的是tcc方案,但是在进行批量操作时,比如说几百台主机一起分配策略时,会执行很长时间,这时体验比较差. 由于zabbix隐藏域后台,而这个 ...
- ucos cpu_a.asm 注释
EXPORT CPU_SR_Save import:翻译为进口或引入,表明要调用的函数为外部文件定义 export:翻译为出口或输出,表明该符号可以被外部模块使用,类似于C中的extern功能. ;* ...
- Linux入门的基础知识点,有这篇就够了(持续更新)
很多粉丝给一口君留言,想要学习Linux资料,其实关注一口君的公众号,后台回复 1024 ,就有很多非常不错的电子书,但是有一个问题,很多粉丝是初学者,而这一大堆电子书,估计随便一本,还没看完就基本上 ...
- 痞子衡嵌入式:英飞凌MirrorBit工艺NOR Flash的扇区架构设计
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是英飞凌MirrorBit工艺NOR Flash的扇区架构设计. NOR Flash 大家都很熟悉,其内部按组织从小到大分为 Page(12 ...
- QGroupBox自定义样式(仿DotNetBar)
QSS如下: QGroupBox { border:1px solid gray; border-radius:5px; margin-top:3ex; font-size:10pt; color:# ...