直接跳到内容
本页目录

作者:侯金霞
更新于:1/18/2023

通用授权

简介

通用授权组件(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"
/>

组件中的属性说明

名称必填类型描述
modelValueBoolean是否打开授权对话框
rightsCodeString要授权的资源关键字段的值,如:流程的编码,文档的id
authorizationTypeString要授权的模块,如:流程(FLOW),文档(DOCUMENT)
saveFlsgBoolean是否自动保存,默认是(true),组件自动保存数据。否(false), 使用@authorization-data事件,自己实现保存逻辑,authorization-data事件会返回选中的数据
authorizationListArray默认打开展示的授权集合

目前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:

  1. 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')
  1. 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='通用资源授权配置';
通用授权 has loaded