掌桥专利:专业的专利平台
掌桥专利
首页

微服务架构下基于权限位的动态权限管理方法及系统

文献发布时间:2023-06-19 19:23:34


微服务架构下基于权限位的动态权限管理方法及系统

技术领域

本发明属于权限管理技术领域,尤其涉及微服务架构下基于权限位的动态权限管理方法及系统。

背景技术

本部分的陈述仅仅是提供了与本发明相关的背景技术信息,不必然构成在先技术。

计算机系统中,对于用户权限的管理,目前较常见的一种方案是RBAC(Ro leBasedAccessContro l l,基于角色的权限访问控制)权限模型。如图1所示,RBAC引入“角色”的概念,将权限与角色绑定,为角色赋予权限,再将用户与角色进行绑定,使其间接获得权限。

在微服务架构下,为实现用户权限的鉴别相较于传统单体式应用,存在三大类问题:

(1)接口权限的收集问题

需要进行权限拦截的接口分布到不同的服务中,且这些服务可能分布在不同的服务器上,收集整理这些接口存在不便。

(2)权限的校验位置问题

微服务架构下,根据访问的压力不同,实现方式不同,可在两处进行权限的校验:API网关统一校验和具体访问的微服务自身进行校验,目前市面上的实现,两种校验只能选其一,尚无自由切换能力。

(3)权限校验的性能问题

如图2所示,无论是AP I网关层做鉴权,还是微服务层做鉴权,目前市面上主流方案,例如OAuth2.0,每次校验,都需要远程访问一次权限中心,这会带来两个问题:

1)每次访问涉及到至少三步:底层通信连接建立、序列化、反序列化。增大了响应时间,降低了实际系统的TPS;

2)由于每次用户请求,都需要进行鉴权,就意味着每次请求都需要访问一次权限认证中心,导致容易出现单点故障和性能瓶颈。

针对以上问题,亟需一种微服务架构下高效安全的权限管理方案。

发明内容

为克服上述现有技术的不足,本发明提供了微服务架构下基于权限位的动态权限管理方法及系统,基于进制转换的位算法,使用权限位压缩需要读取的权限信息,大量减小需要反序列化的数据内容,加速从非内存中读取权限信息;同时,利用计算机基础的与操作,替代查找算法,减小鉴权操作本身的执行时间,降低因复杂鉴权带来的性能损耗,提高微服务架构下权限管理的效率和安全性。

为实现上述目的,本发明的一个或多个实施例提供了如下技术方案:

本发明第一方面提供了微服务架构下基于权限位的动态权限管理方法;

微服务架构下基于权限位的动态权限管理方法,包括:

将收集到的服务接口作一个资源点,进行资源点注册,为其分配相应的权限位和权限值;

基于资源点的权限位和权限值,通过二进制或操作,建立角色-功能点-资源点的三级权限管理体系;

用户对资源点发出请求时,通过二进制与操作,对用户所属角色进行鉴权。

进一步的,所述为其分配相应的权限位,是从64位二进制数中选择一位,作为资源点的权限位;

所述权限值是权限位的值,可以为二进制数,也可以是二进制数对应的十进制数。

进一步的,引入空间位,对权限位进行扩容,用二维数组[idx,pos]来表示全局唯一的一个资源点,其中,idx为空间位,pos为空间内的权限位。

进一步的,所述将收集到的服务接口作一个资源点,进行资源点注册,具体为:

(1)微服务启动时自动发现本地中对外的服务接口,将其收集到内存集合中;

(2)收集完成后,向权限认证中心发送资源点注册请求;

(3)权限认证中心接收到资源点注册请求后,对未注册的资源点进行资源点注册,并返回资源点的唯一编号及对应的权限权;

(4)微服务接收到权限认证中心返回的数据,保存在本地中,用于本地鉴权;

进一步的,所述对未注册的资源点进行资源点注册,是按照[idx,pos]的递增顺序插入资源点,具体为:

(1)如果最新一条记录的pos值小于或等于64位二进制数的最大值时,则idx值取最新一条记录的idx值,pos值取最新一条记录的pos值加1;

(2)如果最新一条记录的pos值超过64位二进制数的最大值时,则pos值置为1,同时idx值取最新一条记录的idx值加1。

进一步的,所述通过二进制或操作,建立角色-功能点-资源点的三级权限管理体系,具体为:

功能点关联多个资源点,将关联的各个资源点的权限值,进行二进制或操作,得到功能点的权限值;

角色关联多个功能点,将关联的各个功能点的权限值,进行二进制或操作,得到角色的权限值;

将资源点、功能点及角色的权限值,保存在本地中。

进一步的,所述对用户所属角色进行鉴权,具体为:

获取用户所属角色的权限值,获取所要请求的资源点的权限值;

将角色的权限值与资源点的权限值,进行二进制与操作;

根据操作结果是否等于资源点的权限值,判断是否具有该资源点的权限。

进一步的,所述鉴权,分为网关层鉴权和服务层本地鉴权,通过运行时配置决定在哪一层进行鉴权。

进一步的,还包括权限信息变化后的权限刷新,具体为:

权限认证中心将最新的资源点、功能点和角色信息,同步到缓存中,利用微服务框架中的统一配置中心,向各个服务(包括网关),发送权限变更通知;

如果是读取缓存的服务,则不需要做任何更新;

如果是读取内存的服务,则需要向权限认证中心获取最新的资源点、功能点和角色信息。

本发明第二方面提供了微服务架构下基于权限位的动态权限管理系统。

微服务架构下基于权限位的动态权限管理系统,包括资源注册模块、体系建立模块和用户鉴权模块:

资源注册模块,被配置为:将收集到的服务接口作一个资源点,进行资源点注册,为其分配相应的权限位和权限值;

体系建立模块,被配置为:基于资源点的权限位和权限值,通过二进制或操作,建立角色-功能点-资源点的三级权限管理体系;

用户鉴权模块,被配置为:用户对资源点发出请求时,通过二进制与操作,对用户所属角色进行鉴权。

以上一个或多个技术方案存在以下有益效果:

本发明基于进制转换的位算法,使用权限位压缩需要读取的权限信息,大量减小需要反序列化的数据内容,加速从非内存中读取权限信息;同时,利用计算机基础的与操作,替代查找算法,减小鉴权操作本身的执行时间,降低因复杂鉴权带来的性能损耗,提高微服务架构下权限管理的效率和安全性。

本发明能实时自动收集不同服务的接口,进行资源点的自动注册;根据需要自由配置或切换网关层鉴权或服务层鉴权,进一步提高了微服务架构下权限管理的效率。

本发明附加方面的优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。

附图说明

构成本发明的一部分的说明书附图用来提供对本发明的进一步理解,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。

图1为现有的RBAC权限模型图。

图2为市面上主流的鉴权方案图。

图3为本发明的RBAC权限模型图。

图4为本发明的权限位示意图。

图5为本发明权限位的或操作示意图。

图6为第一个实施例的方法流程图。

图7为第一个实施例中权限管理体系图。

图8为第一个实施例的鉴权流程图。

图9为第一个实施例的5并发2000次循环鉴权的测试结果图。

图10为第一个实施例的20并发,500次循环鉴权的测试结果图。

图11为第一个实施例的50并发,500次循环鉴权的测试结果图。

图12为第二个实施例的系统结构图。

具体实施方式

下面结合附图与实施例对本发明作进一步说明。

本发明提出一种基于进制转换的位算法的权限管理方案,先对用进制转换的位算法进行详细说明。

本发明依然遵循基础的RBAC权限模型,用户的权限通过角色来进行间接绑定;如图3系统中的菜单、页面、API及产品等资源,通过定义唯一对应的资源点代表其访问属性;某个业务功能的实现,其实就是对一组资源点的访问,将这一组资源点用功能点来代表;由此,角色对于资源的访问,就看角色是否拥有某个功能点,由此实现“用户-角色-功能-资源”的授权模型。

为每个资源点分配一个权限位

在传统RBAC中,通常定义一张关系表来保存角色与权限集的对应关系,实现权限与角色相关联;但随着业务不断发展,会积累下不计其数的功能点,导致关联表的数据极难维护和使用;故在本发明的设计中,用进制转换的位算法来代替和解决这个问题,同时提高存储效率和权限判定效率。

在Java中,Long型是64位有符号的以二进制补码表示的整数,就是64个0或1,如图4所示,每一位可以定义为一个权限位,则最多可标识64个权限位。

假定资源点a是对于文件c的读权限,第0位用来代表,即:0x0000000000000000000000000000000000000000000000000000000000000001,简写为0x1,对应十进制就是2

资源点a代表对于文件c的读权限,其权限位是第0位,权限值是1。假定资源点b是对于文件c的写权限,第1位来代表,即:0x0000000000000000000000000000000000000000000000000000000000000010,简写为0x10,对应十进制就是2

资源点b代表对于文件c的写权限,其权限位是第1位,权限值是2。

使用二进制进行权限判断

利用二进制的特性,权限判断可以定义:如果拥有该权限,则该权限对应位数的值为1;如果没有该权限,则其值为0;那么,一个功能点,要求同时包含文件c的读写能力,则意味对应读权限的权限位(第0位)和写的权限位(第1位)都是1,即:

0x0000000000000000000000000000000000000000000000000000000000000011,相当于把资源点a的权限值和资源点b的权限值做一下“或”操作,如图5所示,所以该功能点的权限值就是3,即一个功能点的权限值就是它所包含的资源点权限值的“或”操作结果。

而一个角色可能拥有多个功能点,则同样的将这些功能点的权限值进行“或”操作就可以得到角色的权限值。

当需要判断某个角色是否拥有某个权限时(即某个资源点的访问能力),则将该角色的权限值与该资源点的权限值进行“与”操作,如果结果仍然是该资源点的权限值,则说明拥有该权限,否则,则表示没有该权限。

例如,一个角色的权限值是5,对应二进制是0x101,资源点a的权限值(文件c的读权限)是1,对应二进制是0x1,资源点b的权限值(文件c的写权限)是2,对应二进制是0x10,则:

运算5&1=1,说明具有文件c的读权限;

运算5&2=0,说明没有文件c的写权限。

由于二进制的特性,一个权限值,既可以代表一个最基本的资源点的权限,又可以代表一组权限的权限值的集合;当其是做集合用时,称为“权限集”;用权限集与资源点的权限值进行与操作,根据结果是否仍等于资源点的权限值,可以用于判断是否具有该资源点的权限。

对权限位进行扩容

64位二进制数中的64位全部被分配出去的话,最多只能代表6个资源点,显然64个资源点对于一个系统来说太少,所以,引入空间位i dx,用二维数组[i dx,pos]来表示全局唯一的一个资源点。

其中,i dx表示第几个空间位,pos表示空间内的权限位,Java中,i dx和pos都定义为Long型,即64位二进制数;每当一个空间内的权限位位满,即都被分配出去,无法再放置更多的资源点时,这时i dx会自增,重新申请一个Long型空间,如此系统可拥有最大(2

在进行权限判断时,将角色的权限值中与资源点的权限值中同样idx的权限位拿出来进行按位与计算,如果结果不为0,则说明拥有该资源点的权限。例如:

角色的权限值对应的权限集为:{[0,-1],[1,1]},表示拥有idx=0,pos∈[0,1,2,..,63]与idx=1,pos=0对应的资源点的权限,如果某个资源点的权限值定义为{[1,1]},则都取idx=1的权限,1&1=1,说明拥有该资源点的权限。

实施例一

本实施例公开了微服务架构下基于权限位的动态权限管理方法;

如图6所示,微服务架构下基于权限位的动态权限管理方法,包括:

步骤S1:将收集到的服务接口作一个资源点,进行资源点注册,为其分配相应的权限位和权限值,具体为:

步骤S101:微服务启动时自动发现本地中对外的服务接口,将其收集到内存集合中。

例如使用Java中的Spr i ngMVC会用@RequestMappi ng等注解标识服务接口,可以定义一个启动时执行的任务,自动从当前运行的代码中收集带有该注解的接口。

步骤S102:收集完成后,向权限认证中心(用于专门管理用户及权限的微服务)发送资源点注册请求;

步骤S103:权限认证中心接收到资源点注册请求后,对未注册的资源点进行资源点注册,最后将已注册的全部资源点返回给微服务,包括资源点的编号及对应的权限权;

(1)识别未注册的资源点

数据库存储已注册的资源点信息,利用唯一索引等技术手段保证识别资源点的唯一性(例如按服务组+HTTP方法+URL作为唯一编号,来识别资源点的唯一);如果数据库中存在,则返回已注册的全部资源点信息;如果不存在,则先进行资源点注册,再返回已注册的全部资源点信息。

(2)资源点注册

按照[idx,pos]的递增顺序插入资源点,具体为:

如果最新一条记录的pos值小于或等于64位二进制数的最大值时,则idx值取最新一条记录的idx值,pos值取最新一条记录的pos值加1;

如果最新一条记录的pos值超过64位二进制数的最大值时,则pos值置为1,同时idx值取最新一条记录的i dx值加1。

如果使用Mysq l存储权限位,需要注意的是MySQL 7中uns igned bigi nt最大值仅支持263 -1,即9223372036854775807,所以实际可用权限位只有63位。

需利用分布式缓存、数据库行锁等技术,保证并发下,idx和pos依然能正确递增。

步骤S104:微服务接收到权限中心注册的结果返回,保存在内存中,用于本地鉴权;

步骤S2:基于资源点的权限位和权限值,通过二进制或操作,建立角色-功能点-资源点的三级权限管理体系;

在有了资源点的权限位和权限值的情况下,可以计算出一组资源点,即功能点的权限值,功能点和资源点是一对多关联关系;有了功能点的权限值,可以计算出一组功能点,即角色的权限集,角色和功能点也是是一对多关联关系,如图7所示。

功能点关联多个资源点,将关联的各个资源点的权限值,进行二进制或操作,得到功能点的权限值;

角色关联多个功能点,将关联的各个功能点的权限值,进行二进制或操作,得到角色的权限值。

在生成功能点和角色的权限值后,权限认证中心把这两者的信息全部保存到分布式缓存中,供之后的鉴权使用。

步骤S3:用户对资源点发出请求时,通过二进制与操作,对用户所属角色进行鉴权,无论鉴权在哪一层做,其逻辑基本相同,如图8所示,具体为:

(1)从缓存中获取所要请求的资源点的权限值,如果不存在对应的资源点,则根据设置的默认值进行放通或拒绝,并返回;

(2)从缓存中查询当前用户所属角色的权限值;

(3)将资源点的权限值与角色的权限值,进行二进制按位与操作;根据操作结果是否等于资源点的权限值,判断是否具有该资源点的权限,即相等则放通,不等则拒绝访问。

根据鉴权的执行位置,分为网关层鉴权和服务层本地鉴权,唯一不同是保存及获取权限信息的方法不同,有三种方法可以保存及读取权限集信息:

保存到当前运行的网关层或服务层的内存中;

保存到缓存(例如Red i s中间件)中;

保存到微服务框架提供的统一配置中心。

三种方法任选其一或混合使用均可;在实际使用时,将鉴权手段做成一个公共的SDK,在网关层和服务层均引用,通过运行时配置决定在哪一层进行鉴权。

还包括权限信息变化后的权限刷新,系统运行时,权限信息在几种情况会需要刷新:

有新的接口上线,即有新的资源点注册;

角色的权限进行手动调整;

此时,权限认证中心将最新的资源点和角色信息,同步到缓存中,利用微服务框架中的统一配置中心,向各个服务(包括网关),发送权限变更通知;如果是读取缓存的服务,则不需要做任何更新;如果是读取内存的服务,则需要向权限认证中心获取最新的资源点和角色信息。

在4核8G服务器上,用JMeter进行三次性能测试:

(1)5并发,2000次循环鉴权,测试结果如图9所示,相较于传统鉴权的321.6的QPS,权限位鉴权性能提升到2233.6的QPS,性能上升7倍。

(2)20并发,500次循环鉴权,测试结果如图10所示,相较于传统鉴权的757.7的QPS,权限位鉴权性能提升到3770.7的QPS,性能上升5倍。

(3)50并发,500次循环鉴权,测试结果如图11所示,相较于传统鉴权的1056.4的QPS,权限位鉴权性能提升到4701的QPS,性能上升4倍。

因此可见,本发明对于鉴权的性能提升较为显著。

实施例二

本实施例公开了微服务架构下基于权限位的动态权限管理系统;

如图12所示,微服务架构下基于权限位的动态权限管理系统,包括资源注册模块、体系建立模块和用户鉴权模块:

资源注册模块,被配置为:将收集到的服务接口作一个资源点,进行资源点注册,为其分配相应的权限位和权限值;

体系建立模块,被配置为:基于资源点的权限位和权限值,通过二进制或操作,建立角色-功能点-资源点的三级权限管理体系;

用户鉴权模块,被配置为:用户对资源点发出请求时,通过二进制与操作,对用户所属角色进行鉴权。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

技术分类

06120115891440