一.通用权限模型
数据权限和功能权限,分开
1.简版权限
1个用户,有1个角色。1个角色,对应多个权限。
用户:角色 = 1:1
角色:权限 = 1:N
只考虑功能权限:菜单权限和按钮权限。
不考虑数据权限
2.标准版权限
在简版权限的基础上,增加数据权限。
规则1:能看到哪些模型,商品/订单/公司/区域
规则2:能看到模型里的哪些数据
基于规则的:自己创建的。管理员看所有的。
复杂点的规则:自己手下的,也能看到。涉及到组织机构。
2个人跟进同一家公司,2个人共同维护一个店铺,都能看到这个店铺。
基于配置的:灵活配置
用户124,分配公司(102、105、106)。
用户163,分配商品(1356,1357,1359)
配置方式:
定制化配置:新增1个数据维度,增加1张表维护(配置中心之类的也可以)
通用配置:类别模型(商品、公司、订单),数据配置模型(id,categoryId,value,remark)
3.灵活版权限
用户直接拥有权限,用户可以有多个角色
3.1 想给用户直接配置权限
用户:权限 = 1:N
用户多了,想给某个用户配置特定的权限。
用户的所有权限 = 用户角色权限(默认权限)+用户特定权限(定制化权限)
3.2 一个用户可以有多个角色
用户:角色=1:N
1个用户既是开发,又是运营
用户的所有权限 = 角色1权限+角色2权限
4. 特定版权限
4.1 组织机构和角色啥关系(一般不同时和权限挂钩)
特殊逻辑,特定需求。
a、简版,角色名,可以按照组织机构,“开发”、“运营”、“老板”、“财务”。
每个部门属于1个角色,特定权限,可以配置多个角色,或者为某个用户特定功能的权限。
b、复杂版,组织机构(用户、部门、岗位)和角色分离。
给单个用户授权、给某个岗位授权。
或者说,整个部门维护所有权限,用户只能从该部门权限里挑选。
c、常见需求:上级可以看到下级的数据
4.2 测试数据权限
为了方便测试人员,在预发和线上测试,增加测试数据权限。 测试角色,添加的数据,为测试数据。
或者,主要模型数据(商品、公司)增加isTest标记,只有测试角色的才能看到,或者某个用户单独标记是否有isTest权限。
二、权限配置
1.前端配置
前端根据,客户需求,灵活配置。 变化点:是否支持多角色、用户直接授权、是否需要数据权限(模型类别维护,公司、区域等)。
2.后端配置
后端支持各种灵活的配置,不同权限模型提供不同的接口。
表结构、存储数据
3.前后端交互
API,CRUD
三、前端权限控制
1、菜单
登录时,获得该用户所有的菜单权限。
2、按钮
登录时,获得
3、数据权限
不需要。 但有可能提供数据权限的“筛选”功能。
比如,管理员能看到所有区域的权限,增加“华中”、“华北”等区域的筛选。
4、2种模式
vue前后端分离模式:JS控制
前后端页面混合模式:Java控制
四、后端权限控制
登录时,会话里维护所有的权限信息。
1、菜单和URL
权限注解+权限拦截器
2、功能
权限注解+权限拦截器
3、数据
商品数据里,额外保存系统编码code,区域regionId等数据标记。
sql查询,添加 in(102,104 ) 。
4、测试
isTest标记
五、特殊逻辑处理
权限中台,提供标准常见的权限配置。
如果权限需求,过于个性化,本地业务系统存储特定权限配置。
数据的时间范围。
六、最难的数据权限,定制字段
需求:灵活配置某个用户或某个角色或某个岗位能看到哪些字段
公司表:id、名称、级别、地址、跟进人、销售额
A用户:id、名称、级别
B用户:id、名称、级别、地址、跟进人
C用户:id、名称、级别、地址、跟进人、销售额
配置中心
用户:A模型:“id,名称,级别”
角色:A模型:“id,名称,级别”
难点:空段实现,列表和Excel报表,甚至图表
配置表,存储应该是“name”,而非“名称”。 前端字段展示:list方法,有权限 才输出
export报表下载,类似。
class Company{
Integer id;
String name;
String address;
}
注意点:为了简化实现,sql查询的时候,不需要根据权限过滤字段。
而是在 展示的时候,再过滤。
字段不涉及到行记录的权限,不需要在sql层面进行过滤,不涉及分页。