高效管理用户权限:深入探索Spring Security的多用户类型认证、授权和Token刷新

news2024/11/27 21:53:05

前言

对于spring secutiry 来讲,其默认是只支持一种数据类型进行认证的,因为最后组件的方法仅为:loadUserByUsername(String username) 方法。

如果有多个系统来使用这个认证模块,会导致查询问题。这也就是不支持多用户类型认证的原因。

因为是多个系统,所以不同系统需要到自己的系统或者表中查询自己的数据,而单单一个参数username显然是不能满足需求的,这里至少还需一个参数来区别不同系统才行。

尽管对于不同系统可以通过增加自定义类型的方法来清醒请求access_token,即调用接口

oauth/token 来获取认证信息。

即如下:

aebea7285e224634f30bec7f23b93d1c.jpeg

但是,在使用 刷新token接口的时候,根据spring security 的机制和上面所说,还是会调用默认的loadUserByUsername 方法,导致程序报错。

这里就需要从程序的角度进行修改。这就是这里介绍的多用户数据类型的情况。

即都是刷新接口,都是调用/oauth/token接口,对应grant_type类型都是password_code类型,

对应在接口中增加一个userType即可。


刚才讲到,自定义授权类型的情况,对于兼容其他系统认证的情况,个人感觉还是不合适的,也就是为了兼容其他系统登录认证最合适的做法是稍后下面的做法,而不是增加授权类型这种这种的方式。

因为,即使获取access_token通过增加授权类型解决了,同样,刷新token还是需要更改,而2者内部其实是使用的同一套东西。

整个过程核心机制是通过接口中增加一个参数如userType来进行识别不同的系统类型,

后台逻辑中通过这个类型而进行判断。

1 登陆获取token

1.1 新增ZltUserDetailsService extends UserDetailsService,

新增自定义的方法。

因直接使用项目中内容,类方法就没有改,自定义适配的可以叫做:

CustomUserDetailsService

36a177a70039c46948713bdc84b7e2e2.jpeg

具体的实现逻辑,后续即可根据userType的值进行不同的执行逻辑:

ffd3f95f5b12a5591c18c61558392714.jpeg

需要注意:这里的userType 是接口传过来的。

后面的所有需要用到userDetailsService的,全部都要替换成自定义ZltUserDetailsService

1.2 复制org.springframework.security.authentication.dao.DaoAuthenticationProvider的代码,自定义 CustomAuthenticationProvider(注意写法,是实现AbstractUserDetailsAuthenticationProvider并将DaoAuthenticationProvider内容复制到此类里面),然后进行修改retrieveUser()方法,其他不需要动.

如下:

b48ba999bc621829f5e8158b1a83a184.jpeg

1.修改 retrieveUser 方法:

可以根据实际逻辑进行编码即可,这里是调用上面逻辑中自定义方法的逻辑:

044408f9643f67212dc8824f3a7e09ea.jpeg

2.修改成员变量:

将 UserDetailsService 变量替换成 ZltUserDetailsService

fd0abce9ba185ec7f9e6280da1253b15.jpeg

同理修改相关的get和set方法:

867443e3a25a330e380727d6135e85a1.jpeg

1.3 到WebSecurityConfigurerAdapter上配置CustomAuthenticationProvider内容。

在目前系统中是 SecurityConfig 类继承了CustomAuthenticationProvider类,故在此类中配置

需注释掉原来的内容:全局用户信息部分。

1ad74b699dc94a6f916bce429cd2132e.jpeg

同步修改成员变量:

ae4ecb7e3bb7e01c6938ca52bf8441f5.jpeg

配置完成后,可以请求接口进行

对应请求参数中增加userType即可。

01725913f368aa675bb8123d625b57a9.jpeg

2 刷新Token

对应逻辑需要同步修改,否则刷新token逻辑会调用原始loadUserByUsername

2.1 复制org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper 自定义 CustomUserDetailsByNameServiceWrapper 在 loadUserDetails() 方法添加自定义的userType

这里依然是复制整个内容,并不是继承UserDetailsByNameServiceWrapper

f422b6cb217f35d1f3aaa889621508a1.jpeg

(1)自定义loadUserDetails() 逻辑

通过相关方法,拿到userType后,即可以根据实际情况进行编码。

最后也是会调用 userDetailsService.loadUserByUsername(userName,userType);

c5719407b9fd5f11c905f83a72869045.jpeg

(2)修改成员变量

98f9b89cde435276c41af5f2900679a0.jpeg

将UserDetailsService内容改为ZltUserDetailsService

(3)同理修改构造体

c0f30379e817791fb7ccff4c4d883931.jpeg

2.2 复制 org.springframework.security.oauth2.provider.token.DefaultTokenServices 到自定义的 CustomTokenServices 然后修改refreshAccessToken() 方法

复制整个内容:

930b70c52e1c70858b70d5b0a45b8421.jpeg

修改 refreshAccessToken 方法:

其实只改了if (this.authenticationManager != null && !authentication.isClientOnly()) 这里面的内容

主要是下面内容:

91032bc576716d782e4be3821ca1cea2.jpeg

2.3 往认证服务器中配置刚刚自定义的两个类 CustomUserDetailsByNameServiceWrapper 和 CustomTokenServices。

这个可能有2种方式,一种是对应页面中展示的这种。

另一种是目前项目实现的这种方式。

2者的背后机制是一样的,因为最后都是将内容实例化后交给spring容器。

这里举例的是后者,因为是经过实际的验证通过的。个人感觉实际项目中这种方式也比较合理这种方式是依赖了自定义授权的基础。

在 TokenGranterConfig.java 类中:

实例化自定义的CustomTokenServices,创建createDefaultTokenServicesCustomer 方法

2a299a98102f23c60585e4352ac921aa.jpeg

声明CustomUserDetailsByNameServiceWrapper 类

因为这里只有声明了新增的CustomUserDetailsByNameServiceWrapper类才会调用对用的类。

1e3a66952581da2924e8790142a1ce4f.jpeg

成员变量修改

3935e59a138ff044dac95f862e59620d.jpeg

调用接口验证:

这个是在body里面:

b3681794803791833a12de03aa83c56b.jpeg

认证内容也需要配置

0354bbe772e4de480a333ffe718bb344.jpeg

配置完进行接口即可:

2b8d34741c45aecfa3ef99d8d0b1ea4e.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1153651.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# TabControl控件设置多行属性multiline为true后切换页签出现空白

一、问题描述: 最近一直在做C#项目,随着项目的不断扩大,Form窗体中TabControl控件的内容一行已经放不下了,于是乎就设置了属性multiline为true,但是随之而来的就是一个新问题。当切换其他程序窗口返回后,就…

10套地理集图库免费分享

前面为大家分享了《161幅2023版可印刷出版的中国标准地图》,还没领取的朋友请点击查看原文领取,今天整理10套地理图库免费分享给大家,主要包括3D地图、地质动图、中国专题图、世界主要城市地图等一共有433张图。 现在只需关注我们“水经注GIS…

rqt-robot-steering控制面板

目录 安装rqt-robot-steering控制面板(已安装则跳过)新建一个终端,先启动ros系统再新建一个终端,运行rqt-robot-steering再打开一个终端,验证使用控制面板控制小乌龟移动 安装rqt-robot-steering控制面板(已…

第一次使用配音软件要怎么选择?

现在的配音软件软件很多,各种类型的都比较多,对于新手小白来说不知该如何选择,今天就来给你分享几款好用的配音软件。不论是制作短视频还是制作平常音频都完全可以。第一款:悦音配音这是一款专业的视频配音软件,多端使…

STM32F4X SDIO(四) SDIO控制器

STM32F4X SDIO(四) SDIO控制器 STM32F4X SDIO控制器SDIO控制器框图SDIO控制器时钟适配器寄存器FIFO控制单元命令路径数据路径 SDIO寄存器SDIO控制相关寄存器SDIO电源控制寄存器 (SDIO_POWER)SDIO时钟控制寄存器 (SDIO_CLKCR)SDIO_CK相位 SDIO命令响应相关…

Linux中正则表达式等

grep命令:主要作用就是过滤查找文本内容 常用的选项有: -m 数字:匹配几次之后停止,按行匹配,不是按字符个数,例如 -v:取反 例如: -n:显示匹配的行号 例如: -c:仅显示匹配的行数,不显示匹配内…

C/C++满足条件的3位数 2020年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C满足条件的3位数 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C满足条件的3位数 2020年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 编写程序,按从小到大的顺序…

C/C++数据结构之时间复杂度和空间复杂度详细解析以及力扣刷题

个人主页:点我进入主页 专栏分类:C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.前言 2.算法的…

中国各城市土地利用类型(城市功能)矢量数据集(shp)

中国各城市土地利用类型(城市功能)数据集 时间:2018年 全国范围的城市用地类型数据(居住/商业/交通用地等共计11类) 分类:居住用地、商业用地、工业用地、医疗设施用地、体育文化设施用地、交通场站用地、绿地等用地类型 含城市编码、一级分类5个、二级分类11个 数据按…

SQL SERVER 表分区

1. 概要说明 SQL SERVER的表分区功能是为了将一个大表(表中含有非常多条数据)的数据根据某条件(仅限该表的主键)拆分成多个文件存放,以提高查询数据时的效率。创建表分区的主要步骤是 1、确定需要以哪一个字段作为分…

语雀P0级时间爆发,留给运维的时间不多了?

事件背景 打工人的焦虑,已经延伸到在线文档了。近日,语雀P0级故障想必大家都有所体会,宕机近8小时,笔记、离线同步完全不可用。作为用户尤其担心我的文档资料是否会因此消失。 这泼天的8小时,放眼互联网界也是相当炸裂…

重生奇迹MU的三大知名宝石

一、祝福宝石 祝福宝石也是重生奇迹中的一种知名宝石,它的体积要比玛雅宝石大一些,颜色是一种粉色,呈菱形的一个多面体,掉在地上或是鼠标移上去,你就能看到“祝福宝石”这几个字样。 如果你打到祝福宝石的话&#xf…

记录微调chatglm3

用于记录chatglm3的过程,防止忘记 需要注意的 可以使用xtuner -h查看有哪些功能可以使用。 [2023-10-31 11:40:18,643] [INFO] [real_accelerator.py:158:get_accelerator] Setting ds_accelerator to cuda (auto detect) 10/31 11:40:22 - mmengine - INFO - Ar…

在Windows上安装Elasticsearch-8.x.x

前言 Elasticsearch 是一种流行的开源搜索和分析引擎,它提供了强大的全文搜索和实时数据分析功能,被广泛应用于各种领域,包括大数据分析、日志处理、企业搜索等。 一、下载 Elasticsearch 官方网站(https://www.elastic.co/dow…

R语言在生态环境领域中的实践技术应用

R语言作为新兴的统计软件,以开源、自由、免费等特点风靡全球。生态环境领域研究内容广泛,数据常多样而复杂。利用R语言进行多元统计分析,从复杂的现象中发现规律、探索机制正是R的优势。为此,以鱼类、昆虫、水文、地形等多样化的生…

Django开发实例总结(入门级、4.2.6、详细)

目录 概述 Django的核心组件包括 Django的项目结构 创建工程(4.2.6) 实例一:Hello world 实例二:访问一个自定义主页 实例三:通过登录跳转到主页 实例四:主页添加静态文件,包含js、css、…

学习Python,为什么可以轻松应对工作大小事?

Python,大名鼎鼎,它在工作中到底能发挥什么样的作用?在现代职场,Python如同一把瑰丽的多功能钥匙,能打开各行各业的大门。无论你是行政助手、财务分析师、电商经营者,还是数据研究员,Python都能…

pychram中cmd已导入docx库仍报错ModuleNotFoundError: No module named ‘docx‘

已经在cmd里pip install python-docx了,但是执行py文件时依然报错,解决方式是在File-Setting-Python Interpreter中点击号,搜索python-docx点击install package等待安装成功再执行文件就不会报错了。

SkyWalking官方文档-1-概述

概述 SkyWalking是一个开源的可观测平台,用于收集,分析,聚合,以及可视化处理来自服务和云原生框架的数据。SkyWalking提供了一种简单的方法来维护分布式系统的清晰视图,即使是跨云。 它是一种现代APM,专门…