学成-授权实现

1.RBAC理论

RBAC0 — 核心模型(基础)

最基础的形态,定义了三个核心要素及其关系:

1
2
3
用户(User) → 分配角色 → 角色(Role) → 分配权限 → 权限(Permission)

操作(Operation) × 对象(Object)
  • 用户 ↔ 角色:多对多(一个用户可有多个角色,一个角色可被多个用户持有)
  • 角色 ↔ 权限:多对多(一个角色有多个权限,一个权限可属于多个角色)
  • 会话(Session):用户登录后激活一个会话,会话中可激活该用户拥有的角色子集

RBAC1 — 角色层级模型

在 RBAC0 基础上加入角色继承

1
2
3
超级管理员
└── 管理员(继承超级管理员的权限子集)
└── 普通用户(继承管理员的权限子集)
  • 通用继承:允许多重继承,形成 DAG(有向无环图)
  • 受限继承:只允许树形单继承,更易管理

RBAC2 — 约束模型

在 RBAC0 基础上加入约束(Constraints),主要有:

约束类型 说明 例子
互斥角色(SSD) 同一用户不能同时持有两个互斥角色 同一人不能既是”出纳”又是”审计”
基数约束 限制角色最多能分配给多少用户 “CEO”角色只能有 1 人
先决条件 必须先有角色 A 才能获得角色 B 必须先是”员工”才能成为”项目经理”
动态互斥(DSD) 同一会话中不能同时激活两个互斥角色 同一次登录中不能同时激活”采购员”和”审批员”

RBAC3 — 统一模型

= RBAC1(继承) + RBAC2(约束),是最完整的形态。


权限的本质:操作 × 对象

权限(Permission)由两个维度构成:

1
2
3
4
5
6
Permission = Operation × Object

例如:
"编辑文章" = edit × /articles/*
"查看订单" = read × /orders/*
"删除用户" = delete × /users/*

image-20260320201322109

2.分配权限

  • 接口注解

    1
    @PreAuthorize("hasAuthority('xc_teachmanager_course_list')")
  • jwt令牌

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    String userJson = JSON.toJSONString(user);
    //用户权限,如果不加报Cannot pass a null GrantedAuthority collection
    String[] authorities= {"test"};
    List<XcMenu> xcMenus = xcMenuMapper.selectPermissionByUserId(user.getId());
    if(xcMenus!=null&&xcMenus.size()>0){
    List<String> permissions = new ArrayList<>();
    xcMenus.forEach((e)->{
    permissions.add(e.getCode());
    });
    authorities = permissions.toArray(new String[0]);
    }
  • 数据库配置权限模型

3.细粒度授权

image-20260320215011136

这个本质上就是 service 方法在编写的时候自己手动去规定自己需要实现的功能