Spring Security学习笔记(一)Spring Security架构原理

前言:本系列博客基于Spring Boot 2.6.x依赖的Spring Security5.6.x版本

Spring Security中文文档:https://springdoc.cn/spring-security/index.html

一、什么是Spring Security

Spring Security是一个安全控制相关的java框架,它提供了一套全面的安全解决方案,包括身份验证、授权、防止攻击等功能。支持点击劫持,CSRF,XSS,MITM(中间人)等常见攻击手段的保护,并提供密码编码,LDAP认证,Session管理,Remember Me认证,JWT,OAuth 2.0等功能特性。Spring Security基于过滤器链的概念,可以轻松地集成到任何基于Spring的应用程序中。

二、Spring Security架构

在Spring Web应用中,基本上只有一个DispatcherServelt,主要用于请求分发,缺乏安全相关的支持和合适的扩展机制。而过滤器(Filter)是运行在Servlet之前的,一个Servlet运行前可能会经过多个Filter。所以在请求到达Servlet之前,先通过Filter进行安全验证就是一个非常合理的实现方式,而Spring Security的功能就是基于Filter来实现的。下图是Spring Security官方提供的架构图。
在这里插入图片描述
从架构图中可以看出,Spring Security功能实现主要由FilterChain、DelegatingFilterProxy、FilterChainProxy、SecurityFilterChain、Security Filter等组件组成。

1、FilterChain

FilterChain是过滤器链,客户端向应用程序发送一个请求时,容器会创建一个由Filter和Servlet组成的过滤器链FilterChain。
通过使用FilterChain,我们可以以插拔的方式添加或移除特定功能的Filter,而无需改动现有的代码,非常方便。

2、DelegatingFilterProxy

Spring Web包中提供了一个名为DelegatingFilterProxy的Filter实现。它的功能是在Servlet容器和Spring容器之间建立桥梁。
Servlet容器不知道Spring定义的Bean,而Spring Security的大部分组件及其依赖都是注册到Spring容器中的Bean。所以DelegatingFilterProxy的主要工作就是从WebApplicationContext获取指定名称的Filter Bean,然后将工作委托这个Bean的doFilter方法
通过这种方式,DelegatingFilterProxy实现了将Servlet容器中的Filter请求委托给Spring容器中的具体Filter Bean处理,从而实现了Servlet容器和Spring容器之间的无缝连接。

3、FilterChainProxy

FilterChainProxy是Spring Security提供的一个特殊的Filter。它的主要作用就是主要作用就是查找匹配当前http请求规则的SecurityFilterChain,然后将工作委派给SecurityFilterChain的所有Filter执行。它是在WebSecurityConfiguration里配置的

4、SecurityFilterChain

一个过滤器链,由一系列Security Filter以及匹配规则组成。当一个http请求符合该SecurityFilterChain的匹配规则,FilterChainProxy就会调用这个SecurityFilterChain里的所有Filter。有多个SecurityFilterChain时,FilterChainProxy只会使用第一个匹配成功的SecurityFilterChain。下图为一个SecurityFilterChain的组成。
在这里插入图片描述
SecurityContextPersistenceFilter:当请求需要认证的资源时,该Filter就是过滤器链的第一个过滤器,用来处理Spring Security的上下文信息,也就是SecurityContext,保证不同请求,但是sessionId相同,也就是同一用户的不同请求,拿到的上下文是相同的,也就是通过SecurityContextHolder.getContext()拿到的信息是同一个。

UsernamePasswordAuthenticationFilter:表单认证Filter,即表单方式登录,校验用户名密码处理。Spring Security默认提供的认证方式之一。
BasicAuthenticationFilter:Basic认证Filter,弹窗输入用户名密码,校验处理,Spring Security默认提供的认证方式之一。

ExceptionTranslationFilter:处理认证及授权过程中抛出的异常,然后返回给客户端。只处理AccessDeniedException和AuthenticationException这两种异常。不是这两种异常,ExceptionTranslationFilter不工作。

FilterSecurityInterceptor:SecurityFilterChain过滤器链的最后一个Filter,用来鉴权,判断用户是否有当前请求资源的权限,来决定是否放行请求。

5、Security Filter

Security Filter就是Spring Security实现具体功能的一些Filter,如CsrfFilter,UsernamePasswordAuthenticationFilter、AuthenticationFilter,AuthorizationFilter等Spring Security默认的Filter。
这些Filter可以用于许多不同的目的,如 认证、授权、漏洞保护 等等。filter 是按照特定的顺序执行的,以保证它们在正确的时间被调用。我们也可以自定义Filter加入的Spring Security执行过程中。
可以在应用启动时,使用INFO级别的日志,在控制台查看Security Filter的列表。

相关推荐

  1. SpringSecurity

    2024-07-13 11:30:06       34 阅读
  2. springSecurity学习springSecurity简介

    2024-07-13 11:30:06       22 阅读
  3. springSecurity学习springSecurity流程

    2024-07-13 11:30:06       16 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 11:30:06       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 11:30:06       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 11:30:06       58 阅读
  4. Python语言-面向对象

    2024-07-13 11:30:06       69 阅读

热门阅读

  1. 菜鸡的原地踏步史07(◐‿◑)

    2024-07-13 11:30:06       17 阅读
  2. C++ 基础练习 - 第一章(英文版)

    2024-07-13 11:30:06       18 阅读
  3. 深入解析BeautifulSoup:Python网页抓取的瑞士军刀

    2024-07-13 11:30:06       21 阅读
  4. Sentinel和hystric的运用详解

    2024-07-13 11:30:06       22 阅读
  5. 如何让代码添加的控件显示出来

    2024-07-13 11:30:06       19 阅读
  6. prompt第四讲-fewshot

    2024-07-13 11:30:06       20 阅读
  7. Netty Websocket SpringBoot Starter

    2024-07-13 11:30:06       23 阅读
  8. 第五十五章 生成的 WSDL 的详细信息 - types

    2024-07-13 11:30:06       22 阅读
  9. 开发指南044-切片编程

    2024-07-13 11:30:06       26 阅读