• 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的列表。

  • 相关阅读:
    React Profiler 性能优化工具
    保洁企业怎么实施智能软件增加客户的互动
    JAVA学习-行为抽象和Lambda.收集器
    Azure 机器学习 - 机器学习中的企业安全和治理
    Python gRPC ALTS 身份验证
    Omapl38+国产FPGA开发板——开发案例使用测试资料说明(下)
    威伦触摸屏TK6060IP简单例子
    基于hexo框架快速从0到1搭建个人博客----部署(三)
    JVS开源底座与核心引擎的全方位探索,助力IT智能、高效、便捷的进化
    Scala入门到精通(尚硅谷学习笔记)章节六——流程控制
  • 原文地址:https://blog.csdn.net/qq_34609889/article/details/140355676