返回首页

JMatrixPlatform 中的 RBAC 与状态

JMatrixPlatform 将 RBAC 与对象状态结合,实现细粒度访问控制。过滤应用于 SQL 级别,状态被审计。提供了角色、策略配置和 promote/demote 方法的示例。

JMatrix 中的状态-角色 RBAC:代码与实践
Advertisement 728x90

JMatrixPlatform 中基于状态的 RBAC:面向生命周期的访问控制

JMatrixPlatform 采用基于状态的角色访问控制(RBAC),将权限与对象的 当前状态 绑定。每个对象均具备类型和生命周期——即一组明确定义的状态序列,精准反映其实际所处阶段。对象创建时需指定其类型及关联的生命周期;初始状态默认为该生命周期中的首个状态,也可在 createAction 中显式覆盖。

同一对象类型可支持多个并行生命周期。例如:

| 对象 | 类型 | 生命周期 | 当前状态 | 可转入的下一状态 |

Google AdInline article slot

|------|------|----------|----------|------------------|

| Obj1 | Type1| LC1 | Stat1 | Stat1*, Stat2 |

| Obj2 | Type1| LC2 | Stat4 | Stat1–4* |

Google AdInline article slot

| Obj3 | Type1| LC3 | Stat2 | Stat1–3* |

典型生命周期示例:

  • 文档管理:草稿 → 已发布 → 审核中 → 已归档 → 已签发
  • 参考数据:新建 → 启用 → 已弃用

状态迁移通过 promote(正向推进)或 demote(反向回退)触发,并在 object_states 表中完整记录审计日志:

Google AdInline article slot
create table object_states (
    object_id uuid not null,
    policy_state varchar(100) not null,
    user_id uuid not null,
    state_start timestamp not null,
    state_end timestamp
);

审计日志支持流程延迟分析:SELECT user_id FROM object_states WHERE policy_state = ? AND (state_end - state_start) >= ?

角色与策略配置

角色继承自 JRole

@JModelPart
public final class ARLReferenceAdmin extends JRole {
  public final static ARLReferenceAdmin ROLE = new ARLReferenceAdmin();

  @Override
  public Set<JRole> getParents() {
    return Set.of(ARLRefDesigner.ROLE, ARLRefChangeManagementAdmin.ROLE, ARLRefApprover.ROLE);
  }

  @Override
  public String getDescription() {
    return "参考数据管理员";
  }
}

生命周期策略继承自 JPolicy

@JModelPart
public final class ALCReference extends JPolicy {
  public final static ALCReference POLICY = new ALCReference();

  @Override
  public Set<JType> getTypes() {
    return Set.of(ATPReference.TYPE);
  }
  
  @Override
  public List<JState> getStates() {
    return List.of(New.STATE, Active.STATE, Inactive.STATE);
  }

  public static final class New extends JPolicy.JState {
    public static final New STATE = new New();
    @Override
    public Set<RoleAccess> getAccess() {
      return Set.of(new RoleAccess(ARLReferenceAdmin.ROLE, AccessType.ALL));
    }
  }

  public static final class Active extends JPolicy.JState {
    public static final Active STATE = new Active();
    @Override
    public Set<RoleAccess> getAccess() {
      return Set.of(
        new RoleAccess(JPublic.ROLE, AccessType.READ),
        new RoleAccess(ARLReferenceAdmin.ROLE, AccessType.PROMOTE, AccessType.DEMOTE));
    }
  }

  public static final class Inactive extends JPolicy.JState {
    public static final Inactive STATE = new Inactive();
    @Override
    public Set<RoleAccess> getAccess() {
      return Set.of(
        new RoleAccess(JPublic.ROLE, AccessType.READ),
        new RoleAccess(ARLReferenceAdmin.ROLE, AccessType.DEMOTE));
    }
  }
}

AccessType 权限类型说明:

  • ALL:完全控制
  • READ:仅查看
  • CREATE:创建新实例
  • MODIFY:编辑现有数据
  • DELETE:删除对象
  • RELEASE:版本管理
  • PROMOTE:推进至下一状态
  • DEMOTE:回退至上一状态
  • CHECKIN:上传文件
  • CHECKOUT:下载文件

对象创建方式:

JDomainObject obj = new JDomainObject();
obj.create(ctx, ATPDocuments.TYPE, ALCDocument.POLICY);

平台在创建时校验 CREATE 权限是否适用于 初始状态。状态迁移调用方式如下:

obj.promote(ctx); // 正向推进
obj.demote(ctx);  // 反向回退

数据库级授权机制

JWT 角色与 Keycloak 深度集成,且行级过滤直接嵌入 SQL 查询——敏感数据未经授权绝不会离开数据库。

最高权限模式

JSystemAdmin 角色绕过全部权限检查,保障极致吞吐性能。

基于状态的访问控制

典型访问矩阵示例:

| 角色 | 新建 | 启用 | 已弃用 |

|---------------------|------------|-------------------------|--------------|

| ARLReferenceAdmin | 全部权限 | 查看、推进、回退 | 查看、回退 |

| JPublic | 无访问权限 | 查看 | 查看 |

JPublic 用户,SQL 过滤条件为:WHERE policy_state IN ('ALCReference.Active', 'ALCReference.Inactive')

对管理员用户:不设状态限制。优化提示:单策略建议最多定义 100 个状态;后续可能引入临时表实现高效过滤。

基于属性的动态过滤

开发进行中。当前递归关系遍历式权限校验效率偏低,正在优化。

核心要点总结

  • 状态深度融入 RBAC 架构,实现细粒度、非破坏性的访问控制。
  • object_states 表提供完整状态审计轨迹,支撑流程分析与合规报告。
  • SQL 层面实时过滤,确保敏感数据永不越权出库
  • 每次 promote/demote 操作均记录操作人 ID 与精确时间戳。
  • Keycloak 角色与 JWT Token 无缝同步,开箱即用。

— Editorial Team

Advertisement 728x90

继续阅读