Spring Boot Security (三)
Spring Boot Security (三)
之前的随笔(https://www.cnblogs.com/zolmk/p/14074227.html)简单的使用了Spring Boot Security,没有深入。
一、主要内容
这篇主要的应用场景为前后端分离,前端Vue,后端Spring Boot(WebFlux)。
本文主要实现了以下几点:
1.使用JdbcUserDetailsManager
或者InMemoryUserDetailsManager
实现用户认证和用户账户修改
2.实现登入登出控制
3.实现资源权限管理
4.解决跨域(cors)问题
注意区分这两个单词:Authentication
和Authorization
(认证和授权),前者通过账号密码进行认证,后者通过token对请求进行授权。
二、实现步骤
2.1 添加依赖
在pom.xml中添加如下依赖项
2.2 Security 配置
这里需要在配置文件中开启 WebFluxSecurity、ReactiveMethodSecurity等、对登录登出的处理、vue跨域问题等。具体配置文件如下:
SecurityConfiguration.java
其中ResponseCode和ResponseUtil是我自己对响应的封装,不重要,ServerHttpResponseUtil内容如下,主要就是将响应对象写入到ServerHttpResponse中。
Security配置部分就这些内容,主要是在ServerHttpSecurity
类上进行操作,配置认证与鉴权的规则和一些处理事件。
2.3 用户认证流程
- vue前端通过axios发起post请求到
/login
接口,认证管理器对账号密码做校验,如果验证正确,则调用ServerAuthenticationSuccessHandler
中的方法,如果失败,调用ServerAuthenticationFailureHandler
中的方法 - 认证成功后,我们可以给用户生成一个token,服务器对token和用户的授权信息进行保存后,将其返回给前端。
- 前端拿到该token后进行本地保存,之后的每次请求都在headers上附带token,服务器根据该token对用户进行授权。
服务器对token和用户授权信息保存的相关类如下:
AuthenticationRepository.java
这里简单省事直接将其保存在了内存中,最好的办法是将其保存在redis等缓存中间件中。类中的方法很简单,不再赘述。
一般而言,后端服务器数据库中不允许保存用户的明文密码,只允许保存加密后的用户密码,因此就需要一个密码编码器。密码验证流程为:1.服务器收到前端传来的密码 2.服务器通过密码编码器对密码进行编码 3.验证数据库中保存的密码和编码后的密码是否匹配 4.处理比对结果。
密码编码器如下:
PasswordEncoderImpl.java
UserDetailsService类,该类实现了ReactiveUserDetailsService
和ReactiveUserDetailsPasswordService
接口,提供密码修改和使用用户名加载用户的功能。内容如下:
UserDetailServiceImpl.java
2.4 用户授权
用户授权过程如下:
1.前端发送请求,并在headers中附带token,通过在SecurityConfiguration配置文件中设置ServerSecurityContextRepository
2.当请求来临时,通过抽取headers中的token,然后根据token从AuthenticationRepository
中获取相应的Authentication
3.然后生成上下文SecurityContextImpl securityContext = new SecurityContextImpl(authentication)
,从而对当前请求进行授权。
2.5 修改密码
简单起见,我直接卸载了Controller层,具体代码如下:
2.6 方法级权限控制
这部分主要用注解来进行控制,示例代码如下:
这里使用了PreAuthorize
注解,它的参数在IDEA中有自动完成提示,大概有以下几种:
- hasAnyRole(roleList):该方法需要具有相应的角色才能调用(只需满足其中一个)
- hasRole(role):同上
- hasPermission():当前用户需要具有对应权限
- hasAuthority(authorityList):当前用户需要获得对应授权(只需满足其中一个)
- hasAnyAuthority(authority):同上
三、问题汇总
3.1 SecurityContextHolder.getContext().getAuthentication()获取不到当前用户
在Controller层,可以通过下面的方式获得:
3.2 使用数据库实现UserDetails的最快方式
Spring Boot Security提供了JdbcUserDetailsManager
类,该类实现了UserDetailsManager
和UserDetailsService
接口,可以很方便的存取和修改用户。相应的表结构,懒得去找,如果要用,在JdbcUserDetailsManager
类中能得到。
__EOF__

本文链接:https://www.cnblogs.com/zolmk/p/17343417.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义