权限服务模块
注意:权限服务(authorize)模块不走数据代理(DBProxy),因此权限相关请求服务无法与其他服务合并使用时使用事务。如果在事务服务中有需要用到权限服务,建议将其放到业务逻辑最后执行。
企业门户应用中提供权限服务模块,位于 model/service/comp/authorize 目录,实现角色、权限、授权管理。下图是企业门户应用架构图中的权限服务模块
- 在权限服务模块中,定义了角色权限相关的数据模型: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 中的“组织授权管理”中的数据,是否发布到正式环境
前端访问角色
在企业门户应用中,权限服务模块提供的角色权限相关的数据集,如下图所示,放到页面上,使用方法同当前应用中的数据集
其他应用,不能通过数据组件访问角色权限相关数据集
后端访问角色
权限相关表在企业门户应用的权限服务模块中,在企业应用中使用 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();
}