activiti7与自身业务系统springsecurity集成,权限问题解决

1,030 阅读1分钟

系统版本依赖:springboot+springSecurity+springsecurity+jwt

问题:系统本身已经集成springsecurity框架做权限验证,新增加工作流模块,使用ProcessRuntime进行查询所有流程定义时遇见权限不足问题。

知识:activiti7使用新Api需要Security验证,需要权限:ROLE_ACTIVITI_USER,还有管理员ROLE_ACTIVITI_ADMIN。只添加ROLE_ACTIVITI_USER即可,ADMIN没有深究。

解决办法:在数据库自身用户表User增加roles(varchar)字段。 设置为ROLE_ACTIVITI_USER。

在自身实现UserDetailsService的方法loadUserByUsername中,给UserDetails设置权限标识。

以下是代码实现:

@Component
public class LoginUserDetailsService implements UserDetailsService {

    @Resource
    private PermissionService permissionService;

    @Resource
    private UserService userService;



    /**
     * 如果当前用户权限被全部取消,应该设置一个处理的事件
     * @param username
     * @return
     * @throws UsernameNotFoundException
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //查询当前用户信息
        SysUser sysUser = userService.selectUserByUsername(username);
        if (sysUser == null) {
            throw new UsernameNotFoundException("用户名或密码错误!");
        }
        //查询当前用户权限  此处需要注意前后端对接问题,role表  查询为空
        List<Permission> permissions = permissionService.selectPermissionByUserId(sysUser.getId());
        //获取authority字段
        List<String> collect = permissions.stream().map(p -> p.getAuthority()).collect(Collectors.toList());
        **//设置activiti7权限
        collect.add(sysUser.getRoles());**
        //转成数组 没权限时这里会报错
        String[] authorities = collect.toArray(new String[collect.size()]);
        //把code转成List<GrantedAuthority>
        List<GrantedAuthority> authorityList = AuthorityUtils.createAuthorityList(authorities);
        //给当前用户设置权限
        sysUser.setPermissionList(permissions);
        //给当前用户设置菜单
        sysUser.setAuthorities(authorityList);
        return sysUser;
    }
}

在sysUser.setAuthorities之前把ROLE_ACTIVITI_USER装进去即可,这样activiti在查询之前会检查到当前用户具备权限。