百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

springsecurity实现前后端分离项目中的认证和授权

ztj100 2025-04-30 21:20 42 浏览 0 评论

以一个最基础的用户管理系统为例,要实现以下功能:

  • 用户密码加密
  • 支持通过用户名、手机号、邮箱 + 密码登录
  • 手机号登录支持短信验证码登录,邮箱登录支持邮件验证码登录
  • 用户登录成功后,之后的请求通过JWT令牌验证身份信息
  • 对于需要保护的接口,进行权限检查

准备工作

1.设计表,并填充数据

使用典型的RBAC模型,共有5张表:

用户表: t_ums_user

角色表: t_ums_role

用户-角色关系表: t_ums_user_role

权限表: t_permission

角色-权限关系表: t_role_permission

2.创建springboot工程,并创建启动类

springboot版本为2.5.14

添加依赖

创建启动类

3.创建数据表对应的实体类

省略每个实体的getter和setter方法

用户

角色

用户-角色

权限

角色-权限

4.集成mybatis


mybatis-spring-boot-starter版本为2.2.2,mysql-connector-java版本为8.0.27

添加mybatis和mysql依赖

在application.yml文件中配置数据源,以及mybatis相关的配置

5.创建每个实体对应的Controller,Mapper接口及其XML映射文件

这里去掉了Service层

5.1 实现发送验证码接口

Validator类:声明用于校验用户名、手机号、邮箱的正则表达式

Cache类:用HashMap模拟一个缓存数据库(实际生产中使用Redis等高性缓存能数据库)

VerifyCodeController:定义发送验证码接口

这里并没有真的去发送验证码,只在控制台中输出。

测试接口

控制台中输出了验证码

5.2 实现增删改查方法

这里只列出必要的增删改查方法

Mapper 接口定义如下,只有UMSUserMapper接口中定义了几个方法

Mapper XML映射文件如下

5.3 实现控制器

作为示例,只在UMSUserController中定义了3个控制器方法:用户注册、查询用户信息、查询用户列表

其中,用户注册方法定义如下

密码加密部分需要用到springsecurity中的api,后续完成

6.引入springsecurity

添加springsecurity依赖

创建一个配置类,用于自定义security

身份认证

配置请求资源拦截规则

  • 获取验证码接口,放行全部
  • 注册接口,放行全部
  • 查看用户信息接口,需要进行身份认证
  • 其它的请求,全部拒绝访问

密码加密

只需要在spring容器中注入一个PasswordEncoder即可

完成注册接口中密码加密部分的代码

测试用户注册接口

顺便把用户表中其它用户的密码也加密一下,写个测试用例

自定义认证数据源

springsecurity默认从内存中获取用户信息(
InMemoryUserDetailsManager),现在需要从数据库中查询用户信息,所以需要自定义。

1.定义UserDetails接口的实现类,封装用户信息

获取权限信息的getAuthoities方法留到权限控制一节中完成。

2.定义UserDetailsService接口的实现类,定义获取用户信息的方法

UserDetails接口默认只声明了根据用户名获取用户信息的方法,这里需要支持用户名、手机号、邮箱登录,所以,共定义了3个获取用户信息的方法

实现密码登录

springsecurity默认使用用户名+密码的方式进行登录认证,我们要同时支持用户名、手机号、邮箱3中账号,需要进行自定义。

0.定义2个异常类,代表在手机号码和邮箱不存在异常

1.定义Authentication认证信息存储类

参考
UsernamePasswordAuthenticationToken类,继承抽象类
AbstractAuthenticationToken,负责存储认证以及权限信息

2.定义登录认证Filter

参考
UsernamePasswordAuthenticationFilter类,继承抽象类
AbstractAuthenticationProcessingFilter,负责从请求中获取认证信息,封装为Authentication对象,然后使用AuthenticationManager去进行认证,具体的验证逻辑由AuthenticationProvider负责

3.定义登录认证Provider

参考
AbstractUserDetailsAuthenticationProvider类,实现接口AuthenticationProvider,负责进行具体的认证

4.定义认证成功、认证失败Handler

认证成功处理器实现接口
AuthenticationSuccessHandler

认证失败处理器实现接口
AuthenticationFailureHandler,认证失败抛出的AuthenticationException异常作为参数传入

5.配置

6.测试

分别使用用户名、手机号、邮箱 + 密码进行登录。

登录成功

登录失败: 用户名不存在

登录失败: 账号格式错误

登录失败: 密码错误

实现验证码登录

验证码登录与密码登录差不多,只要把校验密码改为校验验证码即可。

1.定义Authentication认证信息存储类

2.定义登录认证Filter

3.定义登录认证Provider

4.配置

注入Filter和Provider Bean

配置Filter和Provider

5.测试

先获取一下手机验证码,使用手机号+验证码登录

再获取一下邮箱验证码,使用邮箱+验证码登录

实现JWT认证

注意:网上很多教程将登录后的用户信息存储的Redis中,这其实是错误的做法。JWT本身就可以进行信息交换,并且其初衷就用于实现无状态的身份认证,如果使用Redis存储用户信息,本质上是自己又实现了一套Session机制。

采用jwt实现身份认证与信息交换,主要分为2个步骤:

  • 1.客户端请求登录接口,认证通过后,服务端生成jwt令牌,并返回给客户端
  • 2.客户端请求其它需要认证的接口时,携带token,服务端验证token是否有效,以此决定是否放行

0.生成和解析jwt令牌

这里使用开源库jjwt,github:
https://github.com/jwtk/jjwt#install

添加依赖

在application配置文件中,定义2个配置项,并创建响应的Properties类。其中:

  • secret-key表示jwt密钥,使用接下来定义的JWT工具类生成
  • expiration表示令牌过期时间

创建JWT工具类

1.登录成功后,生成jwt令牌并返回给客户端

修改认证成功处理器

测试

2.定义过滤器,验证jwt令牌

3.定义认证异常处理器

实现AuthenticationEntryPoint接口

4.配置

注入Filter Bean

将JWT Filter添加到过滤器链,并配置认证异常处理器

5.测试

访问用户信息接口

不带token时,认证失败

带上token,访问成功

权限控制

基本使用

1.修改自定义的UserDetails类,完善getAuthorities方法

2.定义访问拒绝异常处理器

实现AccessDeniedHandler接口

3.启用全局方法级别的访问控制

也可以在配置类中,使用基于URL资源的访问控制

4.在需要进行权限检查的控制器方法上,声明权限信息

在访问用户列表的控制器方法上,声明管理员权限

5.测试

普通用户访问,失败

管理员访问,成功

相关推荐

其实TensorFlow真的很水无非就这30篇熬夜练

好的!以下是TensorFlow需要掌握的核心内容,用列表形式呈现,简洁清晰(含表情符号,<300字):1.基础概念与环境TensorFlow架构(计算图、会话->EagerE...

交叉验证和超参数调整:如何优化你的机器学习模型

准确预测Fitbit的睡眠得分在本文的前两部分中,我获取了Fitbit的睡眠数据并对其进行预处理,将这些数据分为训练集、验证集和测试集,除此之外,我还训练了三种不同的机器学习模型并比较了它们的性能。在...

机器学习交叉验证全指南:原理、类型与实战技巧

机器学习模型常常需要大量数据,但它们如何与实时新数据协同工作也同样关键。交叉验证是一种通过将数据集分成若干部分、在部分数据上训练模型、在其余数据上测试模型的方法,用来检验模型的表现。这有助于发现过拟合...

深度学习中的类别激活热图可视化

作者:ValentinaAlto编译:ronghuaiyang导读使用Keras实现图像分类中的激活热图的可视化,帮助更有针对性...

超强,必会的机器学习评估指标

大侠幸会,在下全网同名[算法金]0基础转AI上岸,多个算法赛Top[日更万日,让更多人享受智能乐趣]构建机器学习模型的关键步骤是检查其性能,这是通过使用验证指标来完成的。选择正确的验证指...

机器学习入门教程-第六课:监督学习与非监督学习

1.回顾与引入上节课我们谈到了机器学习的一些实战技巧,比如如何处理数据、选择模型以及调整参数。今天,我们将更深入地探讨机器学习的两大类:监督学习和非监督学习。2.监督学习监督学习就像是有老师的教学...

Python教程(三十八):机器学习基础

...

Python 模型部署不用愁!容器化实战,5 分钟搞定环境配置

你是不是也遇到过这种糟心事:花了好几天训练出的Python模型,在自己电脑上跑得顺顺当当,一放到服务器就各种报错。要么是Python版本不对,要么是依赖库冲突,折腾半天还是用不了。别再喊“我...

超全面讲透一个算法模型,高斯核!!

...

神经网络与传统统计方法的简单对比

传统的统计方法如...

AI 基础知识从0.1到0.2——用“房价预测”入门机器学习全流程

...

自回归滞后模型进行多变量时间序列预测

下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒类型都是时间序列中的一个变量。假设要预测其中一个变量。比如,sparklingwine。如何建立一个模型来进行预测呢?一种常见的方...

苹果AI策略:慢哲学——科技行业的“长期主义”试金石

苹果AI策略的深度原创分析,结合技术伦理、商业逻辑与行业博弈,揭示其“慢哲学”背后的战略智慧:一、反常之举:AI狂潮中的“逆行者”当科技巨头深陷AI军备竞赛,苹果的克制显得格格不入:功能延期:App...

时间序列预测全攻略,6大模型代码实操

如果你对数据分析感兴趣,希望学习更多的方法论,希望听听经验分享,欢迎移步宝藏公众号...

AI 基础知识从 0.4 到 0.5—— 计算机视觉之光 CNN

...

取消回复欢迎 发表评论: