这里我使用ABAC理论来设计:

数据库表设计

  • 用户属性:

    • ```sql
      CREATE TABLE User
      (
      userId int,
      userName varchar(100),
      roleId int
      );
        
      - 环境属性
        - ```sql
          CREATE TABLE Role
          (
          roleId int,
          roleName varchar(100)  # 比如:普通用户,付费用户,积分等级 
          );
  • 操作属性:

    • ```sql
      CREATE TABLE action
      (
      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        # 模块儿具体的内容
          );
  • 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:*",
        ]
      }
  • 这里表示 非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中保存的用户数据与对应的策略进行计算对比,看是否可以授权,如果授权通过,则只能读取到策略规定的访问内容,封装并返回,前端根据信息来展示对应的内容。

细节

  1. Policy内容格式进行规范统一
  2. 需要写一个解析器,来解析Policy的内容
  3. 资源与策略的对应关系与策略本身可以写入Redis中,快速读取和校验

​ 这里的想法是我查阅ABAC理论的思路,之前并未使用过,不过自己推断的流程应该是行的通的,策略与角色之间分离,如果未来有更多的权限管理,只需要修改或加入新的策略,也更灵活。