外观
通用授权
简介
通用授权组件(AbAuthorization)提供数据授权过滤功能,可以通过页面配置,简单整合,快速构建具备授权管理功能。
前端整合
源码位置: agilebpm-ui-v5/src/agilebpm/component/ab-authorization
页面使用组件:
//引用组件
import abAuthorization from '@/agilebpm/component/ab-authorization/index.vue'
// 使用组件
<ab-authorization
      ref="authorizationRef"
      v-model="info.authorizationDialogVisible"
      :authorization-list="info.authorizationData.authorizationList"
      :authorization-type="info.authorizationData.rightsObject"
      :rights-code="info.authorizationData.rightsTarget"
      :save-flsg="false"
      @authorization-data="getAuthorizationList"
/>
组件中的属性说明
| 名称 | 必填 | 类型 | 描述 | 
|---|---|---|---|
| modelValue | 是 | Boolean | 是否打开授权对话框 | 
| rightsCode | 是 | String | 要授权的资源关键字段的值,如:流程的编码,文档的id | 
| authorizationType | 是 | String | 要授权的模块,如:流程(FLOW),文档(DOCUMENT) | 
| saveFlsg | 否 | Boolean | 是否自动保存,默认是(true),组件自动保存数据。否(false), 使用@authorization-data事件,自己实现保存逻辑,authorization-data事件会返回选中的数据 | 
| authorizationList | 否 | Array | 默认打开展示的授权集合 | 
目前AgileBpm 系统内置的authorizationType 有以下几种:
FLOW("FLOW","流程定义"),
CHART("CHART","自定义图表"),
HOME("HOME","首页组件"),
DOCUMENT("DOCUMENT","知识库");
自己实现保存授权逻辑
//页面引入保存接口
import { saveAuthorization } from '@/api/sys/ab-sys-authorization'
//使用保存接口
saveAuthorization(authorizationData).then(() => (//保存成功后自己的逻辑))
 
//保存授权需要转换成的参数对象
authorizationData: {
  rightsTarget: '', 
  rightsObject: '', 
  authorizationList: [] as Array<{
    rightsType: string
    rightsIdentity: string
    rightsIdentityName: string
  }>,
},
页面展示如下图

后端整合
1.引入 ab-sys-api模块
使用通用授权功能,首先要引入sysAuthorizationApi,使用其中的 getUserRightsSql 方法
// 引入maven 
<dependency>
    <groupId>com.dstz</groupId>
    <artifactId>ab-sys-api</artifactId>
</dependency>
// 引入Api
@Autowired
SysAuthorizationApi sysAuthorizationApi
2.添加枚举变量
RightsObjectConstants 定义了授权的类型,该变量必须添加,作为getUserRightsSql 的参数。
枚举类的全限定名:com.dstz.sys.api.constant.RightsObjectConstants
java
com.dstz.sys.api.constant.RightsObjectConstants
public enum RightsObjectConstants {
	VARTEST("NAME","要添加的模块描述");
	
	private final String key;
	private final String label;
	RightsObjectConstants(String key,String label){
		this.key = key;
		this.label = label;
	}
}
3. 使用sysAuthorizationApi.sysAuthorizationApi 方法
在需要过滤的列表查询方法中使用sysAuthorizationApi.sysAuthorizationApi 查询出授权的参数
java
/**
 * 获取授权sql
 * @param rightsObject   授权模块
 * @param userId    用户id
 * @param targetKey 默认为id 为objectTarget授权目标的字段key
 * @return
 */
Map<String, Object> getUserRightsSql(RightsObjectConstants rightsObject, String userId, String targetKey);
4. getUserRightsSql 返回值解析
Map<String, Object> getUserRightsSql 返回的map中有两个值rightsSql,rights:
- rightsSql :连接权限表的sql语句,若查询语句简单可直接在sql中添加 ${rightsSql}
sql
INNER JOIN sys_authorization rights ON id_ = rights.rights_id_ where rights_permission_code_ in ( id-type,groupid-type )
如:
inner join sys_authorization rights on key_ = rights.rights_target_  and  rights.rights_object_ ='FLOW' and rights_permission_code_ in ( '1580490431397937152-org','1580484002737864704-role','user-all','1607311446916005888-org','1-user','427213412995432449-role','1607311446916005888_1580484002737864704-post')
- rights : 权限的数组,当前用户的可授权信息 eg:分公司、组织、角色、岗位等。当复杂sql场景下可以自行使用rights信息,关联sys_authorization表进行数据过滤
set<String> : ["id-user","id-role","id-org"] ...
5. 修改mapper文件
使用 rightsSql 进行数据表与权限表的关联查询
SELECT DISTINCT bpm_definition.*  FROM bpm_definition ${rightsSql}
6.示例
以查询当前用户可以发起的流程列表为例,展示一下sysAuthorizationApi.sysAuthorizationApi 的用法
java
public List<BpmDefinition> getMyDefinitionList(String userId, AbQueryFilter queryFilter,Boolean needHidden) {
		// 获取 rightSql
		Map map = sysAuthorizationApi.getUserRightsSql(RightsObjectConstants.FLOW, userId, "key_");
		DefaultAbQueryFilter filter = (DefaultAbQueryFilter) queryFilter;
		filter.getQueryParam().putAll(map);
		return bpmDefinitionMapper.getMyDefinitionList(queryFilter);
	}
	
	// bpmDefinitionMapper 中拼接 ${rightSql}
	<select id="getMyDefinitionList" parameterType="java.util.Map" resultMap="BpmDefinition">
		SELECT DISTINCT bpm_definition.*  FROM bpm_definition ${rightsSql}
		<where>
			<if test="whereSql!=null">
				 ${whereSql}
			</if>
		</where>
		
	</select>
7. 授权表结构
sql
CREATE TABLE `sys_authorization` (
  `rights_id_` varchar(64)  NOT NULL COMMENT 'ID',
  `rights_object_` varchar(64)  NOT NULL COMMENT '授权对象表分区用 (业务类型)',
  `rights_target_` varchar(64)  NOT NULL COMMENT '授权目标ID',
  `rights_type_` varchar(64)  NOT NULL COMMENT '权限类型',
  `rights_identity_` varchar(64)  NOT NULL COMMENT '授权标识',
  `rights_identity_name_`  NOT NULL COMMENT '标识名字',
  `rights_permission_code_`  NOT NULL COMMENT '授权code=identity+type',
  `rights_create_time_` datetime NOT NULL COMMENT '创建时间',
  `rights_create_by_` varchar(64)  NOT NULL COMMENT '创建人',
  PRIMARY KEY (`rights_id_`) USING BTREE,
  KEY `idx_permission_code_` (`rights_permission_code_`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4  ROW_FORMAT=DYNAMIC COMMENT='通用资源授权配置';
