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.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 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 * @throws UsernameNotFoundException */ @Override @SneakyThrows public UserDetails loadUserByUsername(String username) { String u1 = username.endsWith("@mp") ? username.split("@")[0] : username; Cache cache = cacheManager.getCache(CacheConstants.USER_DETAILS); if (cache != null && cache.get(u1) != null) { return (HnqzUser) cache.get(u1).get(); } R result = remoteUserService.info(username, 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 */ 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用户 return new HnqzUser(user.getUserId(), user.getDeptId(), user.getPhone(), user.getAvatar(), user.getTenantId(), user.getUsername(), SecurityConstants.BCRYPT + user.getPassword(), enabled, true, true, !CommonConstants.STATUS_LOCK.equals(user.getLockFlag()), authorities, user.getPlatId(), user.getDrugEntId(), info.getRoles(), user.getRealname(), user.getLatestChangePwdTime()); } }