以下摘自胖哥分享的 2022开工福利教程。

在学习Spring Security的时候你有没有下面这两个疑问:

  • Spring Security的登录是怎么配置的?
  • Spring Security的访问控制是什么机制?

SpringBootWebSecurityConfiguration

上面两个疑问的答案就在配置类SpringBootWebSecurityConfiguration中。你可以按照下面这个思维导图去理解这个自动配置:

SpringBootWebSecurityConfigurationSpring Boot应用提供了一套默认的Spring Security配置。

	@Bean
@Order(SecurityProperties.BASIC_AUTH_ORDER)
SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().authenticated().and().formLogin().and().httpBasic();
return http.build();
}

这里的配置为:所有的请求都必须是认证用户发起的,同时开启表单登录功能以及Http Basic Authentication认证功能。 我们访问/foo/bar时需要登录认证并且能够进行表单登录就是这个配置起作用了。这个是我们日常开发需要自定义的,在HttpSecurity相关的文章中胖哥也进行了讲解。这个SecurityFilterChain到底是什么呢?

SecurityFilterChain

从上面看得出HttpSecurity就是一个构建类,它的使命就是构建出一个SecurityFilterChain

public interface SecurityFilterChain {
// 当前请求是否匹配
boolean matches(HttpServletRequest request);
// 一揽子过滤器组成的有序过滤器链
List<Filter> getFilters();
}

当一个请求HttpServletRequest进入SecurityFilterChain时,会通过matches方法来确定是否满足条件进入过滤器链。就好比你是VIP走的是VIP通道,享受的是VIP的一系列待遇;你是普通用户,就走普通用户的通道并享受普通用户的待遇。



不管用户是哪种角色,都走的是一个过滤器链,一个应用中存在1-nSecurityFilterChain。那谁来管理多个SecurityFilterChain呢?

记住这个公式HttpSecurity ->SecurityFilterChain

FilterChainProxy

FilterChainProxy是一个GenericFilterBean(即使Servlet Filter又是Spring Bean),它管理了所有注入Spring IoC容器的SecurityFilterChain。在我刚接触Spring Security的时候是这样配置FilterChainProxy的:

    <bean id="myfilterChainProxy" class="org.springframework.security.web.FilterChainProxy">
<constructor-arg>
<util:list>
<security:filter-chain pattern="/do/not/filter*" filters="none"/>
<security:filter-chain pattern="/**" filters="filter1,filter2,filter3"/>
</util:list>
</constructor-arg>
</bean>

根据不同的请求路径匹配走不同的SecurityFilterChain。下面是示意图:



后面还会对接触这个类,现在你只需要明白上面这个图就行了。

请注意:在同一过滤器链中不建议有多个FilterChainProxy实例,而且不应将其作为单纯的过滤器使用,它只应该承担管理SecurityFilterChain的功能。

DelegatingFilterProxy

Servlet 容器和Spring IoC容器之间的Filter生命周期并不匹配。为了让Spring IoC容器管理Filter的生命周期,FilterChainProxy便交由Spring Web下的DelegatingFilterProxy来代理。而且FilterChainProxy不会在添加到应用程序上下文的任何过滤器Bean上调用标准Servlet过滤器生命周期方法,FilterChainProxy的生命周期方法会委托给DelegatingFilterProxy来执行。而DelegatingFilterProxy作为Spring IoCServlet的连接器存在。

简单总结

上面的三个概念非常重要,涉及到Spring Security的整个过滤器链体系。但是作为初学者来说,能看懂多少就看懂多少,不要纠结哪些没有理解,因为目前学习阶段的层次达不到是非常正常的。但是等你学完了Spring Security之后,这几个概念一定要搞明白。

关注公众号:Felordcn 获取更多资讯

个人博客:https://felord.cn

Spring Security过滤器链体系的更多相关文章

  1. Spring Security 过滤器链

    Alias Filter Class Namespace Element or Attribute CHANNEL_FILTER ChannelProcessingFilter http/interc ...

  2. spring-security-4 (3)spring security过滤器的创建与注册原理

    spring security是通过一个过滤器链来保护你的web应用安全.在spring security中,该过滤链的名称为springSecurityFilterChain,类型为FilterCh ...

  3. Spring Security学习笔记-自定义Spring Security过滤链

    Spring Security使用一系列过滤器处理用户请求,下面是spring-security.xml配置文件. <?xml version="1.0" encoding= ...

  4. Spring Security 实战干货:图解Spring Security中的Servlet过滤器体系

    1. 前言 我在Spring Security 实战干货:内置 Filter 全解析对Spring Security的内置过滤器进行了罗列,但是Spring Security真正的过滤器体系才是我们了 ...

  5. Spring Security:Servlet 过滤器(三)

    3)Servlet 过滤器 Spring Security 过滤器链是一个非常复杂且灵活的引擎.Spring Security 的 Servlet 支持基于 Servlet 过滤器,因此通常首先了解过 ...

  6. OAuth 2 开发人员指南(Spring security oauth2)

    https://github.com/spring-projects/spring-security-oauth/blob/master/docs/oauth2.md 入门 这是支持OAuth2.0的 ...

  7. SpringBoot + Spring Security 学习笔记(五)实现短信验证码+登录功能

    在 Spring Security 中基于表单的认证模式,默认就是密码帐号登录认证,那么对于短信验证码+登录的方式,Spring Security 没有现成的接口可以使用,所以需要自己的封装一个类似的 ...

  8. Spring Security OAuth 2开发者指南译

    Spring Security OAuth 2开发者指南译 介绍 这是用户指南的支持OAuth 2.0.对于OAuth 1.0,一切都是不同的,所以看到它的用户指南. 本用户指南分为两部分,第一部分为 ...

  9. [转]Spring Security学习总结一

    [总结-含源码]Spring Security学习总结一(补命名空间配置) Posted on 2008-08-20 10:25 tangtb 阅读(43111) 评论(27)  编辑  收藏 所属分 ...

随机推荐

  1. leetcode日记本

    写在前面: 2019.6开始经过一年的学习,我依然没有学会算法,依然停留在最基本的阶段,面对题目依然一头雾水 但是难不是放弃的理由,根据毛主席的论持久战原理,我决定一天看一点循序渐进,相信总有一天可以 ...

  2. Towards Evaluating the Robustness of Neural Networks

    目录 概 主要内容 基本的概念 目标函数 如何选择c 如何应对Box约束 attack attack attack Nicholas Carlini, David Wagner, Towards Ev ...

  3. 更新系统为High sierra 后无法使用Cocoapods

    sudo gem update --system sudo gem install -n /usr/local/bin cocoapods执行完就可以直接用了.

  4. CS5210设计HDMI to VGA方案|CS5210资料|CS5210设计电路方案

    CS5210是一款HDMI转VGA转换器方案,其输出VGA信号可送到CRT/LED显示器,及投影机等,输入HDMI信号可以驳接电脑.PS3,XBOX360.蓝光DVD,输出VGA可以CRT/LED显示 ...

  5. JSON生成Java实体类

    https://www.bejson.com/json2javapojo/new/ 至于效果怎么样,自己试一下就知道了

  6. Python升级至2.7方法

    在Linux下Python升级至2.7的详细步骤方法, 此处的升级,使用的是全新安装新版本,替换旧版本的方法, 同时新旧版本可以共存,将默认python指向最新2.7版本即可. 1.下载Python- ...

  7. 【Python+Django+Pytest】数据库异常pymysql.err.InterfaceError: (0, '') 解决方案

    问题背景: 接口自动化测试平台,在执行测试案例之外,还需要做以下五件事情(或步骤): 1.查询用户在数据准备中预置的测试套件层数据初始化相关sql  (setUp_class方法中) 2.查询用户在数 ...

  8. Typescript 字符串字面量类型

    字符串字面类型定义的类型是固定的,在其使用时必须是其定义的其中一个字符串,否则会报错 当传入一个定义之外的字符串时,会报错字符串字面量类型.ts(13,20): error TS2345: Argum ...

  9. Git_同一个本地仓库上传到不同的远端仓库(github、gitee)

    一.背景 github访问.推拉代码都太慢了,于是想把github上面的项目全部迁移到gitee(码云)上,但又不想放弃在github上维护项目,于是想同时维护两个远端仓库 二.准备工作 1.创建相同 ...

  10. mysql数据库主从复制教程

    mysql主从复制教程 架构规划: 192.168.201.150 master 主节点 192.168.201.154 slave 从节点 1. 修改mysql的配置文件(主节点,从节点都要修改) ...