Spring Security(一)引入依赖及原理简述
目录
一、引入依赖及原理简述 <— 你在这里 ( •̀ ω •́ )y
二、多用户维护配置
三、基础自定义配置
四、前后端分离及登录结果管理
五、角色权限管理基础
从此处开始,为新的原创内容,相关数据结构代码换了一套新的,与之前的代码关系不大了。
建议新建一个项目,将配置文件复制过来,然后按照步骤走。
Spring Security(一)引入依赖及原理简述
博主前言:本以为这个就是代替传统 jwt 的插件,没想到复杂程度如此之高。Spring Security 本身是个高度自定义化的组件,必须花时间重点学习一下。以下为个人配置学习的流程,从零到权限管理、redis嵌入等步骤。
本文基于尚硅谷的 Spring Security 教程学习,文章与原教程有不小出入,仅供参考。
B站视频链接:尚硅谷Java项目SpringSecurity+OAuth2权限管理实战教程
一、引入 Spring Security 及示例操作
- 实现简单的登录验证 - 首先创建一个 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: 修改的新密码- 此时重新启动程序,会发现控制台不再生成密码。 
- Spring Security 未自定义配置时的功能 - 重定向8080端口,维护默认url
- 自动创建和维护一个登录账户
- 提供基于表单的登录和注销流程
- 处理各式安全问题(csrf 跨域攻击、https等)
 - 而上述这些功能,仅仅是引入了一个依赖,自动全实现了,这就是 Spring Security 强大之处。 - 若有需要,都建议使用其替代原项目中的 token 模块。 
- 重定向
二、Spring Security 实现原理
官网有这么一幅图,描述了 Spring 的 Servlet 架构:

一般情况下,Spring 的 Servlet 架构最终抽象为 Controller,所以理解为 Controller 就行。
Spring 对 Servlet 的支持是基于Servlet过滤器的,其结构结构大致就是这样,由Filter链中一个个Filter过滤拦截,由此实现不同功能的检验操作。
每一个 Filter 都具备以下功能:
- 防止下游的 Filter实例或Servlet被调用。在这种情况下,Filter通常会使用HttpServletResponse对客户端写入响应。
- 修改下游的 Filter实例和Servlet所使用的HttpServletRequest或HttpServletResponse。
也正因如此,Filter之间的顺序是很重要的。不过,虽然 Servlet 容器允许通过使用自己的标准来注册Filter实例,但它不知道 Spring 定义的Bean。为了让Filter的工作托管给Bean,可以通过标准的Servlet容器机制来注册 DelegatingFilterProxy。

DelegatingFilterProxy从ApplicationContext查找Bean Filter,然后调用Bean Filter。
然后重量级的来了:

SecurityFilterChain被FilterChainProxy定当前请求应该调用哪些 Spring Security Filter 实例。
换句话说,Spring Security 从原本不支持Bean的Filter链中独立出来,扩展出一条支持Bean的Filter子链。
下面这段话从官网抄的,介绍了这么做的优势:(脱裤子放屁)
与直接向 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子链,虽然可能用不到:

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


