HnqzUserDetailsServiceImpl.java 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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.data.redis.core.RedisTemplate;
  19. import org.springframework.security.core.GrantedAuthority;
  20. import org.springframework.security.core.authority.AuthorityUtils;
  21. import org.springframework.security.core.userdetails.UserDetails;
  22. import org.springframework.security.core.userdetails.UsernameNotFoundException;
  23. import org.springframework.stereotype.Service;
  24. import javax.security.auth.login.AccountLockedException;
  25. import java.util.Arrays;
  26. import java.util.Collection;
  27. import java.util.HashSet;
  28. import java.util.Set;
  29. /**
  30. * 用户详细信息
  31. *
  32. * @author hnqz
  33. */
  34. @Slf4j
  35. @Service
  36. @AllArgsConstructor
  37. public class HnqzUserDetailsServiceImpl implements HnqzUserDetailsService {
  38. private final RemoteUserService remoteUserService;
  39. private final CacheManager cacheManager;
  40. /**
  41. * 用户密码登录
  42. *
  43. * @param username 用户名
  44. * @return UserDetails
  45. * @throws UsernameNotFoundException 异常
  46. */
  47. @Override
  48. @SneakyThrows
  49. public UserDetails loadUserByUsername(String username) {
  50. String rawUsername;
  51. boolean isApp;
  52. if (username.endsWith("@mp")) {
  53. isApp = true;
  54. rawUsername = username.split("@")[0];
  55. } else {
  56. isApp = false;
  57. rawUsername = username;
  58. }
  59. // Cache cache = cacheManager.getCache(CacheConstants.USER_DETAILS);
  60. // if (cache != null && cache.get(rawUsername) != null) {
  61. // return (HnqzUser) cache.get(rawUsername).get();
  62. // }
  63. R<UserInfo> result = remoteUserService.info1(rawUsername, isApp, SecurityConstants.FROM_IN);
  64. UserDetails userDetails = getUserDetails(result);
  65. // cache.put(username, userDetails);
  66. return userDetails;
  67. }
  68. /**
  69. * 根据社交登录code 登录
  70. *
  71. * @param inStr TYPE@CODE
  72. * @return UserDetails
  73. * @throws UsernameNotFoundException 异常
  74. */
  75. @Override
  76. @SneakyThrows
  77. public UserDetails loadUserBySocial(String inStr) {
  78. return getUserDetails(remoteUserService.social(inStr, SecurityConstants.FROM_IN));
  79. }
  80. /**
  81. * 构建 UserDetails
  82. *
  83. * @param result 用户信息
  84. * @return UserDetails
  85. */
  86. private UserDetails getUserDetails(R<UserInfo> result) {
  87. if (result == null || result.getData() == null) {
  88. throw new UsernameNotFoundException("用户不存在");
  89. }
  90. UserInfo info = result.getData();
  91. Set<String> dbAuthsSet = new HashSet<>();
  92. if (ArrayUtil.isNotEmpty(info.getRoles())) {
  93. // 获取角色
  94. Arrays.stream(info.getRoles()).forEach(roleId -> dbAuthsSet.add(SecurityConstants.ROLE + roleId));
  95. // 获取资源
  96. dbAuthsSet.addAll(Arrays.asList(info.getPermissions()));
  97. }
  98. Collection<? extends GrantedAuthority> authorities = AuthorityUtils
  99. .createAuthorityList(dbAuthsSet.toArray(new String[0]));
  100. SysUser user = info.getSysUser();
  101. boolean enabled = StrUtil.equals(user.getLockFlag(), CommonConstants.STATUS_NORMAL);
  102. // 构造security用户
  103. if (!CommonConstants.STATUS_NORMAL.equals(user.getLockFlag())){
  104. throw new RuntimeException("当前账号已经锁定了");
  105. }
  106. return new HnqzUser(user.getUserId(),
  107. user.getDeptId(),
  108. user.getPhone(),
  109. user.getAvatar(),
  110. user.getTenantId(),
  111. user.getUsername(),
  112. SecurityConstants.BCRYPT + user.getPassword(),
  113. enabled,
  114. true,
  115. true,
  116. CommonConstants.STATUS_NORMAL.equals(user.getLockFlag()),
  117. authorities,
  118. user.getPlatId(),
  119. user.getDrugEntId(),
  120. info.getRoles(),
  121. user.getRealname(),
  122. user.getLatestChangePwdTime());
  123. }
  124. }