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
5spring:
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 是一个高可靠性、高度自定义化的组件。