目录
一、引入依赖及原理简述 <— 你在这里 ( •̀ ω •́ )y
二、多用户维护配置
三、基础自定义配置
四、前后端分离及登录结果管理
五、角色权限管理基础


从此处开始,为新的原创内容,相关数据结构代码换了一套新的,与之前的代码关系不大了。
建议新建一个项目,将配置文件复制过来,然后按照步骤走。

六、RBAC 结构实现
七、自定义响应式登录与 JWT 配置
八、集成 Redis

Spring Security(一)引入依赖及原理简述

博主前言:本以为这个就是代替传统 jwt 的插件,没想到复杂程度如此之高。Spring Security 本身是个高度自定义化的组件,必须花时间重点学习一下。以下为个人配置学习的流程,从零到权限管理、redis嵌入等步骤。
本文基于尚硅谷的 Spring Security 教程学习,文章与原教程有不小出入,仅供参考。
B站视频链接:尚硅谷Java项目SpringSecurity+OAuth2权限管理实战教程

一、引入 Spring Security 及示例操作

  1. 实现简单的登录验证

    首先创建一个 spring boot 3 示例项目,只包含启动类和一个简单的 controller:

    项目结构

    引入的 Spring Security 依赖:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-test</artifactId>
    <scope>test</scope>
    </dependency>

    启动项目,访问8080端口,发现被重定向到 /login,并弹出了一个登录页面:

    我配置了一个模板,这个模板不配置也可以,也是登录页面,不影响后续操作。

    登录页面

    默认的用户名为 user,密码由控制台给出:

    控制台密码

    若要自定义用户与密码,修改 application.yml:

    1
    2
    3
    4
    5
    spring:
    security:
    user:
    name: 修改的新用户名
    password: 修改的新密码

    此时重新启动程序,会发现控制台不再生成密码。

  2. Spring Security 未自定义配置时的功能

    • 重定向8080端口,维护默认url
    • 自动创建和维护一个登录账户
    • 提供基于表单的登录和注销流程
    • 处理各式安全问题(csrf 跨域攻击、https等)

    而上述这些功能,仅仅是引入了一个依赖,自动全实现了,这就是 Spring Security 强大之处。

    若有需要,都建议使用其替代原项目中的 token 模块。


二、Spring Security 实现原理

官网有这么一幅图,描述了 Spring 的 Servlet 架构:

Filter链1

一般情况下,Spring 的 Servlet 架构最终抽象为 Controller,所以理解为 Controller 就行。

Spring 对 Servlet 的支持是基于Servlet过滤器的,其结构结构大致就是这样,由Filter链中一个个Filter过滤拦截,由此实现不同功能的检验操作。

每一个 Filter 都具备以下功能:

  • 防止下游的 Filter 实例或 Servlet 被调用。在这种情况下,Filter 通常会使用 HttpServletResponse 对客户端写入响应。
  • 修改下游的 Filter 实例和 Servlet 所使用的 HttpServletRequestHttpServletResponse

也正因如此,Filter之间的顺序是很重要的。不过,虽然 Servlet 容器允许通过使用自己的标准来注册Filter实例,但它不知道 Spring 定义的Bean。为了让Filter的工作托管给Bean,可以通过标准的Servlet容器机制来注册 DelegatingFilterProxy

Filter链2

DelegatingFilterProxyApplicationContext查找Bean Filter,然后调用Bean Filter

然后重量级的来了:

Filter链3

SecurityFilterChainFilterChainProxy定当前请求应该调用哪些 Spring Security Filter 实例。

换句话说,Spring Security 从原本不支持BeanFilter链中独立出来,扩展出一条支持BeanFilter子链

下面这段话从官网抄的,介绍了这么做的优势:(脱裤子放屁)

与直接向 Servlet 容器或 DelegatingFilterProxy 注册相比,FilterChainProxy有很多优势。首先,它为 Spring Security 的所有 Servlet 支持提供了一个起点。由于这个原因,如果你试图对 Spring Security 的 Servlet 支持进行故障诊断,在 FilterChainProxy 中添加一个调试点是一个很好的开始。

其次,由于FilterChainProxy是 Spring Security 使用的核心,它可以执行一些不被视为可有可无的任务。 例如,它清除了SecurityContext以避免内存泄漏。它还应用 Spring Security 的HttpFirewall来保护应用程序免受某些类型的攻击。

此外,它在确定何时应该调用 SecurityFilterChain 方面提供了更大的灵活性。在Servlet容器中,Filter 实例仅基于URL被调用。 然而,FilterChainProxy 可以通过使用 RequestMatcher 接口,根据 HttpServletRequest 中的任何内容确定调用。

同样地,可以存在多个Filter子链,虽然可能用不到:

Filter链4

这就有点吓人了,不过确实如此,Spring Security 是一个高可靠性、高度自定义化的组件。