HnqzUserDetailsServiceImpl.java 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package com.qunzhixinxi.hnqz.auth.service;
  2. import cn.hutool.core.util.ArrayUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.qunzhixinxi.hnqz.admin.api.dto.UserInfo;
  5. import com.qunzhixinxi.hnqz.admin.api.entity.SysUser;
  6. import com.qunzhixinxi.hnqz.admin.api.feign.RemoteUserService;
  7. import com.qunzhixinxi.hnqz.common.core.constant.CacheConstants;
  8. import com.qunzhixinxi.hnqz.common.core.constant.CommonConstants;
  9. import com.qunzhixinxi.hnqz.common.core.constant.SecurityConstants;
  10. import com.qunzhixinxi.hnqz.common.core.util.R;
  11. import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
  12. import com.qunzhixinxi.hnqz.common.security.service.HnqzUserDetailsService;
  13. import lombok.AllArgsConstructor;
  14. import lombok.SneakyThrows;
  15. import lombok.extern.slf4j.Slf4j;
  16. import org.springframework.cache.Cache;
  17. import org.springframework.cache.CacheManager;
  18. import org.springframework.security.core.GrantedAuthority;
  19. import org.springframework.security.core.authority.AuthorityUtils;
  20. import org.springframework.security.core.userdetails.UserDetails;
  21. import org.springframework.security.core.userdetails.UsernameNotFoundException;
  22. import org.springframework.stereotype.Service;
  23. import java.util.Arrays;
  24. import java.util.Collection;
  25. import java.util.HashSet;
  26. import java.util.Set;
  27. /**
  28. * 用户详细信息
  29. *
  30. * @author hnqz
  31. */
  32. @Slf4j
  33. @Service
  34. @AllArgsConstructor
  35. public class HnqzUserDetailsServiceImpl implements HnqzUserDetailsService {
  36. private final RemoteUserService remoteUserService;
  37. private final CacheManager cacheManager;
  38. /**
  39. * 用户密码登录
  40. *
  41. * @param username 用户名
  42. * @return
  43. * @throws UsernameNotFoundException
  44. */
  45. @Override
  46. @SneakyThrows
  47. public UserDetails loadUserByUsername(String username) {
  48. String u1 = username.endsWith("@mp") ? username.split("@")[0] : username;
  49. Cache cache = cacheManager.getCache(CacheConstants.USER_DETAILS);
  50. if (cache != null && cache.get(u1) != null) {
  51. return (HnqzUser) cache.get(u1).get();
  52. }
  53. R<UserInfo> result = remoteUserService.info(username, SecurityConstants.FROM_IN);
  54. UserDetails userDetails = getUserDetails(result);
  55. cache.put(username, userDetails);
  56. return userDetails;
  57. }
  58. /**
  59. * 根据社交登录code 登录
  60. *
  61. * @param inStr TYPE@CODE
  62. * @return UserDetails
  63. * @throws UsernameNotFoundException
  64. */
  65. @Override
  66. @SneakyThrows
  67. public UserDetails loadUserBySocial(String inStr) {
  68. return getUserDetails(remoteUserService.social(inStr, SecurityConstants.FROM_IN));
  69. }
  70. /**
  71. * 构建userdetails
  72. *
  73. * @param result 用户信息
  74. * @return
  75. */
  76. private UserDetails getUserDetails(R<UserInfo> result) {
  77. if (result == null || result.getData() == null) {
  78. throw new UsernameNotFoundException("用户不存在");
  79. }
  80. UserInfo info = result.getData();
  81. Set<String> dbAuthsSet = new HashSet<>();
  82. if (ArrayUtil.isNotEmpty(info.getRoles())) {
  83. // 获取角色
  84. Arrays.stream(info.getRoles()).forEach(roleId -> dbAuthsSet.add(SecurityConstants.ROLE + roleId));
  85. // 获取资源
  86. dbAuthsSet.addAll(Arrays.asList(info.getPermissions()));
  87. }
  88. Collection<? extends GrantedAuthority> authorities = AuthorityUtils
  89. .createAuthorityList(dbAuthsSet.toArray(new String[0]));
  90. SysUser user = info.getSysUser();
  91. boolean enabled = StrUtil.equals(user.getLockFlag(), CommonConstants.STATUS_NORMAL);
  92. // 构造security用户
  93. return new HnqzUser(user.getUserId(),
  94. user.getDeptId(),
  95. user.getPhone(),
  96. user.getAvatar(),
  97. user.getTenantId(),
  98. user.getUsername(),
  99. SecurityConstants.BCRYPT + user.getPassword(),
  100. enabled,
  101. true,
  102. true,
  103. !CommonConstants.STATUS_LOCK.equals(user.getLockFlag()),
  104. authorities,
  105. user.getPlatId(),
  106. user.getDrugEntId(),
  107. info.getRoles(),
  108. user.getRealname(),
  109. user.getLatestChangePwdTime());
  110. }
  111. }