二、Activiti——系统用户及角色与Activiti用户与组扩展绑定

作者: 小疯子 分类: Activiti 发布时间: 2020-03-11 10:35

一、基本说明

1.1 描述

Activiti的用户和组在数据库中对应的表为act_id_user, act_id_group,二者关联为act_id_membership
系统用户和角色对应表为sys_user,sys_role,sys_user_role
因为后台操作都是基于系统用户的,所以如果系统用户需要进行流程相关操作需要与activiti的用户扩展绑定

1.2 扩展绑定表

将sys_user表中添加字段act_user_id外键关联绑定act_id_user表,同样sys_role也添加act_group_id字段

二、开发

代码太多不写那么多,只写一下思路以及和activiti相关的代码

2.1 系统用户添加

实现思路
step1. 系统用户添加
step2. 用户所属部门关联
step3. activiti用户添加,我这里是用了微服务实现(目前微服务之间调用关于事务处理还未研究)
调用方:

ActUserRequestVO actUserRequestVO = new ActUserRequestVO();
        actUserRequestVO.setName(sysUser.getUsername());
        actUserRequestVO.setPwd(sysUser.getPassword());
        actUserRequestVO.setEmail(sysUser.getEmail());
        Map actUser = activitiService.addUser(actUserRequestVO);

被调用方的service实现:

public Map addUser(ActUserRequestVO actUserRequestVO) {
        String id = UUID.randomUUID().toString();
        User user = identityService.newUser(id);
        user.setLastName(actUserRequestVO.getName());
        user.setPassword(actUserRequestVO.getPwd());
        user.setEmail(actUserRequestVO.getEmail());
        identityService.saveUser(user);
        user = identityService.createUserQuery().userId(id).singleResult();
        if( user == null) {
            return null;
        }
        Map map = new HashMap<>();
        map.put(&quot;userId&quot;, user.getId());
        return map;
    }

step4. 关联系统角色,通过添加sys_user_role表实现
step5. 用户角色关联需要同步到activiti的用户组和activiti用户关联
a. 根据绑定的系统角色们找到关联的activiti的用户组id们组成个列表传入——groupIdsList(怎么关联上去的看下面的2.2系统角色添加)
b. 然后再得到系统用户绑的activiti的用户id,将其和上面的用户组id作为参数传给Activiti微服务
调用方代码:

activitiService.saveActMemberShip(String.valueOf(actUser.get(&quot;userId&quot;)), groupIdsList.toArray(new String[groupIdsList.size()]));

activiti微服务方service代码:

public void saveActMemberShip(String userId, String[] groupId) {
        for(String gid: groupId) {
            identityService.createMembership(userId, gid);
        }
    }

关于用户的修改,就不说了,差不多也是这种思路,不过修改的用户名称邮箱啥的还是要更新到activiti用户上

2.2 系统角色添加

上面有说过系统角色是和activiti的用户组关联的,所以添加
系统角色的时候需要同步添加activiti用户组
调用方代码:

public boolean save(RoleRequestDTO roleRequestDTO) {
        SysRole sysRole = EntityUtils.vm2Entity(roleRequestDTO, SysRole.class,&quot;id&quot;);
        sysRole.setActGroupId(roleRequestDTO.getCode());
        boolean save = roleService.save(sysRole);
        ActGroupRequestVO groupRequestVO = new ActGroupRequestVO();
        groupRequestVO.setId(roleRequestDTO.getCode());
        groupRequestVO.setType(roleRequestDTO.getCode());
        groupRequestVO.setName(roleRequestDTO.getName());
        Object o = activitiService.addGroup(groupRequestVO);
        return save;
    }

activiti微服务被调用方代码:

@Override
    public Group addGroup(ActGroupRequestVO actGroupRequestVO) {
        if(ObjectUtils.isEmpty(actGroupRequestVO)) {
            return null;
        }
        if(actGroupRequestVO.getType() == null || actGroupRequestVO.getName() == null){
            return null;
        }

        Group group1 = identityService.createGroupQuery().groupId(actGroupRequestVO.getType()).singleResult();
        if(group1 == null) {
            Group group = identityService.newGroup(actGroupRequestVO.getType());
            group.setName(actGroupRequestVO.getName());
            group.setType(actGroupRequestVO.getType());
            identityService.saveGroup(group);
            return group;
        }
        return group1;

    }
0