权限服务模块

注意:权限服务(authorize)模块不走数据代理(DBProxy),因此权限相关请求服务无法与其他服务合并使用时使用事务。如果在事务服务中有需要用到权限服务,建议将其放到业务逻辑最后执行。

企业门户应用中提供权限服务模块,位于 model/service/comp/authorize 目录,实现角色、权限、授权管理。下图是企业门户应用架构图中的权限服务模块

1719214141871

  • 在权限服务模块中,定义了角色权限相关的数据模型:authorize.data.m、resource.data.m、permission.data.m、role.data.m 和 delegation.data.m
  • 权限服务模块提供客户端访问 API,参考《组织权限 API
    • 授权 API:com.justep.clients.api.AuthorizeApi
    • 角色 API:com.justep.clients.api.RoleApi
  • 权限服务模块提供3个环境变量
    • 开发时运行时都可配置,开发时配置如上图所示,运行是配置如下图所示
    • 最低权限要求:设置为注册用户,表示登录后可访问,设置为匿名用户,表示不登录也可访问
    • 是否开启页面权限
    • 是否迁移开发时页面授权:在 IDE 中的“组织授权管理”中的数据,是否发布到正式环境

1719214434139

前端访问角色

在企业门户应用中,权限服务模块提供的角色权限相关的数据集,如下图所示,放到页面上,使用方法同当前应用中的数据集

1719193530801

其他应用,不能通过数据组件访问角色权限相关数据集

后端访问角色

权限相关表在企业门户应用的权限服务模块中,在企业应用中使用 DBRest Java SDK 访问,参考《DBRest Java SDK

下面列举两个案例

查询授权表,关联角色表

授权表 authorize,角色表 role,SQL 写为

select * from authorize a join role r on a.role_id = r.id 
where r.code='eventing_dashboard' or r.parent_role_codes like '%eventing_dashboard%'

Java 代码如下

    public String getOrgHasRole(String roleCode) throws Exception {
        DbrestWrapper<?> wrapper = (DbrestWrapper<?>) new DbrestWrapper("entry","authorize","authorize");
        wrapper.select("a.*");
        wrapper.setMainTableAlias("a");
        wrapper.innerJoin("comp/authorize/role").alias("r").on("role_id.eq.id");
        wrapper.eq("r.code",roleCode).or().like("r.parent_role_codes",roleCode);
        DbrestResult ret = DbrestUtil.get(wrapper, null);
        return ret.getResult();
    }

特别说明

  • 上面代码中的 eventing_dashboard 是一个角色编码
  • 角色表中的 parent_role_codes 里面允许存储多个角色编码,所以不能使用相等,本例使用了 like,如果角色编码存在包含关系,不能简单使用 like

查询组织表,关联授权表和角色表

组织表 orgs,授权表 authorize,角色表 role,SQL 写为

select A.fid,A.code,A.name,C.code as rolecode,C.name as rolename from orgs A 
    left Join authorize B on org_id=subject_id
    left join role C on role_id=B.id

Java 代码如下

    public String getOrgsRole() throws Exception {
        DbrestWrapper<?> wrapper = (DbrestWrapper<?>) new DbrestWrapper("entry","uaa","orgs");
        wrapper.select("A.fid as fid","A.code as code","A.name as name","C.code as rolecode","C.name as rolename");
        wrapper.setMainTableAlias("A");
        wrapper.leftJoin("comp/authorize/authorize").alias("B").on("org_id.eq.subject_id");
        wrapper.setLeftAliasUsed("B");
        wrapper.leftJoin("comp/authorize/role").alias("C").on("role_id.eq.id");
        DbrestResult ret = DbrestUtil.get(wrapper, null);
        return ret.getResult();
    }

results matching ""

    No results matching ""