Spring Cloud微服务架构中的数据权限DataPermision实现方案

Spring Cloud微服务架构中的数据权限DataPermision实现方案

一、出现原因

在Spring Cloud的微服务架构中,常见的权限控制除了菜单权限外,还有数据权限DataPermision。菜单权限主要用于控制用户角色所能访问的菜单以及页面按钮的显示与否,而数据权限则控制业务数据显示当前公司,还是所有公司,还是当前公司及其子公司的数据。

近几年Java项目中,数据中台也解决了部分数据权限问题,本文来讲解下几种DataPermision数据权限实现方案。

二、核心问题

DataPermision的主要问题在于查询性能、授权、鉴权以及字段级别的控制。

例如在百万级别的微服务Spring Cloud架构数据规模,mysql如何实现秒级别的查询?

百万级别的权限DataPermision如何授予用户?

如何快速高效的进行数据鉴权?

怎样实现字段级别的权限控制?

三、权限模型的核心抽象

先列出一张图,介绍权限模型的核心概念:


Spring Cloud微服务架构中的数据权限DataPermision实现方案


根据上图权限分析可以分析,能够观察到以下几个元素,只要是:权限实体、部门、角色、菜单权限。

菜单权限:用于控制能显示哪些菜单,以及页面按钮的显示权限。

权限实体:本部分是DataPermision模型的核心元素,也就是我们需要系统进行控制的数据。例如:Customer客户、Order订单,渠道,区域等。

Dept部门:也就是一般意义上的部门组织结构。

角色Role:用于进行抽象的实体,用来进行快速分配权限相同权限给一批用户,与菜单权限中的角色概念一致。

四、权限DataPermision的查询模型

根据上面的权限模型图,列出一条sql:

select xxx from xx_table where account in (xxx) and product_group in (xxx) and country in (xxx)

这就是这个模型的查询模型。其中account,product_group,country代表需要做权限控制的权限实体。

在这里只是一个简单的模型,如果account或者country等数据量足够大时,可以发现mysql in查询是会出现非常严重的查询性能的。比如account数据量规模为100万级别时。

4.1引入部门组织结构,突破数据量的限制

还是依赖于Spring Cloud DataPermision模型图,我们有一个部门组织结构,我们可以想象下:例如总经理,自然是能够查看所有部门的数据。比如A部门经理,可以查看A部门和他们的子部门的数据权限。如果是普通的员工,只能查看自己账号下面的数据。

我们给出一个部门的微服务组织结构图,给每个部分标志一个key,key的生成规则:

1.根部门的key为数字10


2.根部门的直属部门的key为10 001,10 002,10 003...以此类推


3.其他的key生成逻辑和步骤2相同,唯一不同的就是key的长度变长了,比如:10 001 001,10 001 002

我们给部门贴上下面的key:


Spring Cloud微服务架构中的数据权限DataPermision实现方案


有了该模型,我们结合mysql的前置查询索引的特性(dept like 'xxxx%')

where dept like '10%'

dept like '10001%'

dept like '10002%'

上面的查询,在mysql下,300万的数据规模,可以实现1S内响应!!!

4.2怎样授权

查询性能问题解决之后,授权也就是可以解决了。

授权我们一般根据员工的岗位来设定,普通员工,部门经理

普通员工:不需要单独授权,直接绑定员工工号即可

部门经理:设置该员工可以查看的部门(支持多个)

4.3怎样鉴权

进行鉴权和来自授权一般是相互的一个过程


1.判断该员工是否为使用的部门经理


2.如果是,取出部门权限的key


3.添加到sql中,使用mysql前置like查询数据

4.4数据库的实现

1.识别权限实体

2.给权限实体加上一个工号字段,一个部门字段,比如:emp_no,dept_no

3.查询时,先获取员工的角色权限,如果是部门经理,那么获取对应的key列表

4.构建sql,加入部门或者工号的sql片段:

dept_no like '10 001%' or dept_no like '10 002%',这是部门的sql

emp_no = 'xxx',这是普通员工的sql

五、总结

Spring Cloud微服务架构中还需要识别出权限实体,进行控制的数据。还需要注意数据库索引的结合。易于扩展。

本文所介绍的方法易于在微服务架构扩展,易于进行权限控制。

您可能还会对下面的文章感兴趣: