123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- package com.qunzhixinxi.hnqz.auth.service;
- import cn.hutool.core.util.ArrayUtil;
- import cn.hutool.core.util.StrUtil;
- import com.qunzhixinxi.hnqz.admin.api.dto.UserInfo;
- import com.qunzhixinxi.hnqz.admin.api.entity.SysUser;
- import com.qunzhixinxi.hnqz.admin.api.feign.RemoteUserService;
- import com.qunzhixinxi.hnqz.common.core.constant.CacheConstants;
- import com.qunzhixinxi.hnqz.common.core.constant.CommonConstants;
- import com.qunzhixinxi.hnqz.common.core.constant.SecurityConstants;
- import com.qunzhixinxi.hnqz.common.core.util.R;
- import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
- import com.qunzhixinxi.hnqz.common.security.service.HnqzUserDetailsService;
- import lombok.AllArgsConstructor;
- import lombok.SneakyThrows;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.cache.Cache;
- import org.springframework.cache.CacheManager;
- import org.springframework.data.redis.core.RedisTemplate;
- import org.springframework.security.core.GrantedAuthority;
- import org.springframework.security.core.authority.AuthorityUtils;
- import org.springframework.security.core.userdetails.UserDetails;
- import org.springframework.security.core.userdetails.UsernameNotFoundException;
- import org.springframework.stereotype.Service;
- import javax.security.auth.login.AccountLockedException;
- import java.util.Arrays;
- import java.util.Collection;
- import java.util.HashSet;
- import java.util.Set;
- /**
- * 用户详细信息
- *
- * @author hnqz
- */
- @Slf4j
- @Service
- @AllArgsConstructor
- public class HnqzUserDetailsServiceImpl implements HnqzUserDetailsService {
- private final RemoteUserService remoteUserService;
- private final CacheManager cacheManager;
- /**
- * 用户密码登录
- *
- * @param username 用户名
- * @return UserDetails
- * @throws UsernameNotFoundException 异常
- */
- @Override
- @SneakyThrows
- public UserDetails loadUserByUsername(String username) {
- String rawUsername;
- boolean isApp;
- if (username.endsWith("@mp")) {
- isApp = true;
- rawUsername = username.split("@")[0];
- } else {
- isApp = false;
- rawUsername = username;
- }
- // Cache cache = cacheManager.getCache(CacheConstants.USER_DETAILS);
- // if (cache != null && cache.get(rawUsername) != null) {
- // return (HnqzUser) cache.get(rawUsername).get();
- // }
- R<UserInfo> result = remoteUserService.info1(rawUsername, isApp, SecurityConstants.FROM_IN);
- UserDetails userDetails = getUserDetails(result);
- // cache.put(username, userDetails);
- return userDetails;
- }
- /**
- * 根据社交登录code 登录
- *
- * @param inStr TYPE@CODE
- * @return UserDetails
- * @throws UsernameNotFoundException 异常
- */
- @Override
- @SneakyThrows
- public UserDetails loadUserBySocial(String inStr) {
- return getUserDetails(remoteUserService.social(inStr, SecurityConstants.FROM_IN));
- }
- /**
- * 构建 UserDetails
- *
- * @param result 用户信息
- * @return UserDetails
- */
- 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]));
- SysUser user = info.getSysUser();
- boolean enabled = StrUtil.equals(user.getLockFlag(), CommonConstants.STATUS_NORMAL);
- // 构造security用户
- if (!CommonConstants.STATUS_NORMAL.equals(user.getLockFlag())){
- throw new RuntimeException("当前账号已经锁定了");
- }
- return new HnqzUser(user.getUserId(),
- user.getDeptId(),
- user.getPhone(),
- user.getAvatar(),
- user.getTenantId(),
- user.getUsername(),
- SecurityConstants.BCRYPT + user.getPassword(),
- enabled,
- true,
- true,
- CommonConstants.STATUS_NORMAL.equals(user.getLockFlag()),
- authorities,
- user.getPlatId(),
- user.getDrugEntId(),
- info.getRoles(),
- user.getRealname(),
- user.getLatestChangePwdTime());
- }
- }
|