ABAC权限设计
这里我使用ABAC理论来设计:
数据库表设计
用户属性:
- ```sql
CREATE TABLE User
(
userId int,
userName varchar(100),
roleId int
);- 环境属性 - ```sql CREATE TABLE Role ( roleId int, roleName varchar(100) # 比如:普通用户,付费用户,积分等级 );
- ```sql
操作属性:
- ```sql
CREATE TABLEaction
(
actionId int,
actionName varchar(100) # 比如:read读,write评论
);- 试读 - 付费读 - 免费读 - 评论 - Resources属性: - ```sql CREATE TABLE module # 我们最终操作的资源,例如查看的文章,数据 ( moduleId int, moduleName varchar(100), # 比如:Java基础模块儿,Java高级模块儿 moduleTitle varchar(50), # 模块儿的标题 这里就可以通过Policy来自定义控制展示 moduleDes varchar(255), # 模块儿的描述 moduleContent text # 模块儿具体的内容 );
- ```sql
Policy策略:
- ```sql
CREATE TABLE policy # 这里定义我们的权限控制方案
(
policyId int,
policyDetail varchar(255), # 在下面我们将给出示例
policyStatus tinyint # 策略状态,例如禁用,启用
);- Policy 与 Resources 关联表, - 其中一个资源可能有多个策略,比如针对资源普通用户一种策略,付费用户一种策略,这取决于我们Policy如何解析,是否加入or的操作 - 一个策略可能也针对多个资源生效 定义不同的Policy, - Java模块儿下文章免费读取或评论 ```json { "effect":"Allow", "actions":[ "read","write" ], "resources":[ "Module:java:article:*", ] }
- ```sql
这里表示 非vip用户,可以读取Java模块儿下文章的标题和描述,其中condition相当于条件,也可以定义多种条件
{
"effect":"Allow",
"actions":[
"read"
],
"resources":[
"Module:java:article:title",
"Module:java:article:description"
],
"condition":["isVip:0"]
}
通过Policy可以控制,哪些资源可以哪些用户访问,其中普通用户能访问什么,访问多少,具体展示可以在Resources中控制。而Resoures与Policy做关联。
大体流程
用户登录时,后台将用户信息保存到Session中,当用户想要访问某个资源时并进行操作时,后台读取该资源对应的策略,然后通过Session中保存的用户数据与对应的策略进行计算对比,看是否可以授权,如果授权通过,则只能读取到策略规定的访问内容,封装并返回,前端根据信息来展示对应的内容。
细节
- Policy内容格式进行规范统一
- 需要写一个解析器,来解析Policy的内容
- 资源与策略的对应关系与策略本身可以写入Redis中,快速读取和校验
这里的想法是我查阅ABAC理论的思路,之前并未使用过,不过自己推断的流程应该是行的通的,策略与角色之间分离,如果未来有更多的权限管理,只需要修改或加入新的策略,也更灵活。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 玲辰书斋!