JMatrixPlatform 中基于状态的 RBAC:面向生命周期的访问控制
JMatrixPlatform 采用基于状态的角色访问控制(RBAC),将权限与对象的 当前状态 绑定。每个对象均具备类型和生命周期——即一组明确定义的状态序列,精准反映其实际所处阶段。对象创建时需指定其类型及关联的生命周期;初始状态默认为该生命周期中的首个状态,也可在 createAction 中显式覆盖。
同一对象类型可支持多个并行生命周期。例如:
| 对象 | 类型 | 生命周期 | 当前状态 | 可转入的下一状态 |
|------|------|----------|----------|------------------|
| Obj1 | Type1| LC1 | Stat1 | Stat1*, Stat2 |
| Obj2 | Type1| LC2 | Stat4 | Stat1–4* |
| Obj3 | Type1| LC3 | Stat2 | Stat1–3* |
典型生命周期示例:
- 文档管理:草稿 → 已发布 → 审核中 → 已归档 → 已签发
- 参考数据:新建 → 启用 → 已弃用
状态迁移通过 promote(正向推进)或 demote(反向回退)触发,并在 object_states 表中完整记录审计日志:
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
暂无评论。