-
获取用户角色信息
入参格式:{"username":"curadmin","deptId":"370202000000","sysCode":"1","gmsfhm":" ","rybh":"0111"}
- 认证逻辑,username就是UserDetails对象中的username
-
构建userdetail(项目中的实现类为PigxUser)并根据角色授权,构建userdetail对象的username为
user.getUsername()+"-"+user.getUserId()+"-"+info.getRoles()[0];
/** * 构建userdetails * * @param result 用户信息 * @return */ private UserDetails getUserDetails(R<UserInfo> result) { if (result == null || result.getData() == null) { throw new UsernameNotFoundException("用户不存在"); } UserInfo info = result.getData(); Set<String> dbAuthsSet = new HashSet<>(); if (ArrayUtil.isNotEmpty(info.getRoles())) { // 获取角色 Arrays.stream(info.getRoles()).forEach(roleId -> dbAuthsSet.add(SecurityConstants.ROLE + roleId)); // 获取资源 dbAuthsSet.addAll(Arrays.asList(info.getPermissions())); } Collection<? extends GrantedAuthority> authorities = AuthorityUtils.createAuthorityList(dbAuthsSet.toArray(new String[0])); UserVO user = info.getSysUser(); boolean enabled = StrUtil.equals(user.getLockFlag(), CommonConstants.STATUS_NORMAL); // 构造security用户 String key = user.getUsername()+"-"+user.getUserId()+"-"+info.getRoles()[0]; return new PigxUser(user.getUserId(), user.getDeptId(), user.getDeptName(), user.getTenantId(), key, SecurityConstants.BCRYPT + user.getPassword(),user.getTruename(), enabled, true, true, !CommonConstants.STATUS_LOCK.equals(user.getLockFlag()), authorities); }
认证结果
执行无参info方法,可以理解为认证通过后再去数据库里获取一次用户信息
/**
* 获取当前用户全部信息
*
* @return 用户信息
*/
@GetMapping(value = {"/info"})
public R info() {
PigxUser pu = SecurityUtils.getUser();
String username = SecurityUtils.getUser().getUsername();
String[] usernameStr = username.split("-");
SysUser user = userService.getOne(Wrappers.<SysUser>query().lambda()
.eq(SysUser::getUserId, usernameStr[1]) );
if (user == null) {
return R.failed(null, "获取当前用户信息失败");
}
return R.ok(userService.findUserInfo(user,usernameStr[2]));
}
程序不存在问题,是操作的问题。只有登录信息填写的不对才会去创建新账号,而后出现角色退化是因为登录信息传的就是普通用户。