Spring Security过滤器链体系的实例详解
作者:码农小胖哥 发布时间:2023-08-25 03:24:15
以下摘自胖哥分享的 2022开工福利教程。
在学习Spring Security的时候你有没有下面这两个疑问:
Spring Security的登录是怎么配置的?
Spring Security的访问控制是什么机制?
SpringBootWebSecurityConfiguration
上面两个疑问的答案就在配置类SpringBootWebSecurityConfiguration
中。你可以按照下面这个思维导图去理解这个自动配置:
SpringBootWebSecurityConfiguration
为Spring 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-n
个SecurityFilterChain
。那谁来管理多个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 IoC和Servlet的连接器存在。
简单总结
上面的三个概念非常重要,涉及到Spring Security的整个过滤器链体系。但是作为初学者来说,能看懂多少就看懂多少,不要纠结哪些没有理解,因为目前学习阶段的层次达不到是非常正常的。但是等你学完了Spring Security之后,这几个概念一定要搞明白。
来源:https://www.cnblogs.com/felordcn/p/15878803.html
猜你喜欢
- 错误处理到目前为止,我们都没怎么介绍onComplete()和onError()函数。这两个函数用来通知订阅者,被观察的对象将停止发送数据以
- 1 简介Solace是一个强大的实时性的事件驱动消息队列。本文将介绍如何在Spring中使用,虽然代码使用的是Spring Boot,但并没
- instanceof关键字用于判断一个引用类型变量所指向的对象是否是一个类(或接口、抽象类、父类)的实例。 举个例子:public
- 前言这里主要简单介绍如何使用Camera+SurfaceView自定义相机拍照,如果是Camera2或者是TextureView的可以前往主
- idea spring Initializr创建项目勾选项目所需要的依赖pom.xml文件会加载勾选的依赖,也可以不勾选后面通过自己常用的p
- 1.ArrayList 是基数组结构的,需要连续的内存空间从构造函数可以看出,ArrayList内部用一个Object数组来保存数据。对于无
- Android版本更新实例详解1、导入xutils的jar包 2、在AndroidManifest.xml中添加权限 3、选择下载的路径,和
- 1.返回ModelAndView对象(.jsp)controller代码:package controller;import java.ut
- 本篇给大家详细讲解了MTKAndroid平台开发流程,大致分为44个步骤,我们把每个步骤的命令详细讲解了下,一起来学习下。1.拷贝代码仓库从
- 首先给出一段代码:public class AslistMethod { public static void main(String[]
- 在编写ui界面时因为手机分辨率大小不同,所以展现出来的效果也是不同的,这个时候就需要考虑适配器,让根据手机分辨率自动适配相应尺寸来展示界面,
- File 类:文件和目录路径名的抽象表示。注意:File 类只能操作文件的属性,文件的内容是不能操作的。1、File 类的字段我们知道,各个
- Java中List.of()和Arrays.asList()的区别及原因动手写一下,让自己更有印象1.Arrays.asList()可以插入
- 本文实例讲述了Android编程基于自定义View实现绚丽的圆形进度条功能。分享给大家供大家参考,具体如下:本文包含两个组件,首先上效果图:
- 最近几年玩得最疯狂的应该是发红包了,尤其是过年的时候特别受欢迎,下面写了红包的随机算法,其实挺简单的,仅是提供一种思路,希望可以给大家一些启
- 本文实例讲述了C#实现对Json字符串处理方法,分享给大家供大家参考。具体分析如下:一般对于web应用开发人员来说对Json字符串都会很熟悉
- Google 发布的Material Design支持库,对我们的APP设计有很大的影响,如果重新设计APP,支持库应该直接用V4提升到V7
- 本文实例为大家分享了Flutter自定义圆盘取色器的具体代码,供大家参考,具体内容如下下面展示一些 内联代码片。圆盘取色器效果图完整代码im
- activity A和BA 获取数据的activity B返回数据的activity点击A上的按钮,在A的textview上显示
- 一、目的本篇文章的目的是记录本人使用flutter加载与调用第三方aar包。二、背景本人go后端,业余时间喜欢玩玩flutter。一直有一个