系统版本依赖: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在查询之前会检查到当前用户具备权限。