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 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 result) { if (result == null || result.getData() == null) { throw new UsernameNotFoundException("用户不存在"); } UserInfo info = result.getData(); Set 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 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()); } }