大家好,我是不才陈某~ 这是《Spring Cloud 进阶》第18篇文章,往期文章如下:
这篇文章介绍下网关层如何集成RBAC权限模型进行认证鉴权,文章目录如下: 什么是RBAC权限模型?RBAC(Role-Based Access Control)基于角色访问控制,目前使用最为广泛的权限模型。 相信大家对这种权限模型已经比较了解了。此模型有三个用户、角色和权限,在传统的权限模型用户直接关联加了角色层,解耦了用户和权限,使得权限系统有了更清晰的职责划分和更高的灵活度。 以上五张表的SQL就不再详细贴出来了,都会放在案例源码的doc目录下,如下图: 设计思路RBAC权限模型是基于角色的,因此在Spring Security中的权限就是角色,具体的认证授权流程如下:
上述只是大致的流程,其中还有一些细节有待商榷,如下: 1、URL对应的权限如何维护?这个就比较容易实现了,涉及到RBAC权限模式的三张表,分别为权限表、角色表、权限角色对应关系表。具体实现流程如下:
比如权限中有这么一条数据,如下: 其中的 /order/info 这个URL就是一个权限,管理员可以对其分配给指定的角色。 2、如何实现Restful风格的权限控制?restful风格的接口URL是相同的,不同的只是请求方式,因此要想做到权限的精细控制还需要保留请求方式,比如POST,GET,PUT,DELETE.... 可以在权限表中的url字段放置一个method标识,比如POST,此时的完整URL为:POST:/order/info “ 3、这样能实现动态权限控制吗?权限的控制方式有很多种,比如Security自身的注解、方法拦截,其实扩展Spring Security也是可以实现动态权限控制的,这个在后面的文章中会单独介绍! 陈某此篇文章是将权限、角色对应关系存入Redis中,因此想要实现动态权限控制只需要在Redis中维护这种关系即可。Redis中的数据如下: 案例实现此篇文章还是基于以下三个模块进行改动,有不清楚的可以查看陈某往期文章。
涉及到的更改目录如下图: 1、从数据库加载URL<->角色对应关系到Redis在项目启动之初直接读取数据库中的权限加载到Redis中,当然方法有很多种,自己根据情况选择。代码如下: 此处代码在oauth2-cloud-auth-server模块下。 2、实现UserDetailsService加载权限UserDetailsService相信大家都已经很熟悉了,主要作用就是根据用户名从数据库中加载用户的详细信息。 代码如下: ①处的代码是将通过JPA从数据库中查询用户信息并且组装角色,必须是以 ROLE_ 开头。 ②处的代码是将获取的角色封装进入authorities向下传递。 此处代码在oauth2-cloud-auth-server模块下。 “ 3、鉴权管理器中校验权限在上篇文章中实战干货!Spring Cloud Gateway 整合 OAuth2.0 实现分布式统一认证授权!详细介绍了鉴权管理器的作用,这里就不再细说了。代码如下: ①处的代码是将请求URL组装成restful风格的,比如POST:/order/info ②处的代码是从Redis中取出URL和角色对应关系遍历,通过AntPathMatcher进行比对,获取当前请求URL的所需的角色。 ③处的代码就是比较当前URL所需的角色和当前用户的角色,分为两步:
此处的代码在oauth2-cloud-gateway模块中。 “ 4、总结关键代码就是上述三处,另外关于一些DAO层的相关代码就不再贴出来了,自己下载源码看看! “ 附加的更改这篇文章中顺带将客户端信息也放在了数据库中,前面的文章都是放在内存中。 数据库中新建一张表,SQL如下:
认证服务中的OAuth2.0的配置文件中将客户端的信息从数据库中加载,该实现类为JdbcClientDetailsService,关键代码如下:
总结本篇文章介绍了网关集成RBAC权限模型进行认证鉴权,核心思想就是将权限信息加载Redis缓存中,在网关层面的鉴权管理器中进行权限的校验,其中还整合了Restful风格的URL。 如果这篇文章对你有所帮助,或者有所启发的话,帮忙点赞、在看、转发、收藏,你的支持就是我坚持下去的最大动力! |
|
来自: woh5r1ofyffxnh > 《待分类》