spring security初识

153 阅读2分钟

记录一下自己的spring security学习之路

最近开始准备一套权限框架,考虑到成熟度的问题,准备在已有的成熟框架上进行开发,考虑过shiro和spring security,最后选中了spring security,接下来就开始从0学习spring security。

spring security的前世今生

Spring Security 最早不叫 Spring Security ,而是叫 Acegi Security。
Acegi Security 基于 Spring,可以帮助我们为项目建立丰富的角色与权限管理,但是最广为人诟病的则是它臃肿繁琐的配置,这一问题最终也遗传给了 Spring Security。
直到spring boot出现让配置变得轻松,spring security开始被大量使用。

核心功能

对于一个权限管理框架来说, 最核心的功能一般就两个方面:
- 认证
- 授权

认证也就是登陆验证,授权也就是是否能查看资源的权限

开始学习搭建一个基于spring boot, spring security, webflux的程序

首先,新建一个spring boot项目, 引入maven如下
![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c4646568f7814f9c89a5969dbe9e906f~tplv-k3u1fbpfcp-watermark.image)
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b327bba093534772b775f97dead0ac7a~tplv-k3u1fbpfcp-watermark.image)
创建项目后,添加一个测试接口
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c5df4ff77da74ba8a18be22788dfee77~tplv-k3u1fbpfcp-watermark.image)
然后启动项目,访问默认8080端口
![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/253be623fdea423da7f32d97a0078d0d~tplv-k3u1fbpfcp-watermark.image)
![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a57138d6240d4f3598a2b63915c7a603~tplv-k3u1fbpfcp-watermark.image)
发现需要登陆,说明spring security已经接管项目中的接口
用用户名为 user 密码为启动时打印的字符串登陆
![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c6a602f805f9406a86e56a2ed7643034~tplv-k3u1fbpfcp-watermark.image)
![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b652268bc60148bb941be7a27b614350~tplv-k3u1fbpfcp-watermark.image)
登陆成功并拿到接口返回数据
比较好奇这个默认的登陆名和密码是怎么来的,我们接下来走源码中去看一下
![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/8665e7cb01ef4bc89159fdee93d72c45~tplv-k3u1fbpfcp-watermark.image)
可以看到,登陆的密码是从这个地方生成的
根据此方法往上继续查看可以看到,security自动配置了一个reactiveUserDeatilsService,并且生成了密码
![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/87cf6ee974ad4d59a35e4a1e787c0c5b~tplv-k3u1fbpfcp-watermark.image)
然后根据生成UserDetails的方法发现,用户是在SecurityProperties文件中
![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d8ec6d642fee412190be1a87ba689cfc~tplv-k3u1fbpfcp-watermark.image)
接下来再进入该文件
就会发现,默认的用户名和密码
![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4b305621cbe34eb89692d19ecba3745b~tplv-k3u1fbpfcp-watermark.image)
该文件的前缀
![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/50f8d03b53cd4bfc99e9e669597815b9~tplv-k3u1fbpfcp-watermark.image)
根据这个我们可以实现在配置类中自己配置登陆的用户名和密码。
这种情况只能有一个用户名和密码,比较适合单一账号的场景,比如在使用eureka作为注册中心时,可以使用这种方式,让各个服务使用同一的账号登陆,防止其他没有账户的服务注册到你的注册中心。
![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0a2d2da09fd0491e8d1ec76168a0e9e7~tplv-k3u1fbpfcp-watermark.image)
接下来重启服务 访问测试接口并登陆
![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c021b06a30ed450ab2a913c7d3c78e6d~tplv-k3u1fbpfcp-watermark.image)
![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/78309220732a4a3abc544fcf79c8aaec~tplv-k3u1fbpfcp-watermark.image)
这样一个简单配置的spring security就完成了