package cn.mb.cloud.auth.security.service.impl; import cn.hutool.core.util.StrUtil; import cn.mb.cloud.auth.security.component.MbCloudAuthUser; import cn.mb.cloud.auth.security.entity.User; import cn.mb.cloud.auth.security.mapper.UserMapper; import cn.mb.cloud.auth.security.service.MbCloudUserAuthDetailsService; import cn.mb.cloud.auth.security.service.SysSocialDetailsService; import cn.mb.cloud.common.api.vo.UserVO; import cn.mb.cloud.common.core.constant.CommonConstants; import cn.mb.cloud.common.core.constant.SecurityConstants; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; 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.Collection; /** * 用户详细信息 * * @author jason */ @Slf4j @Service @AllArgsConstructor public class MbCloudAuthUserDetailsServiceImpl implements MbCloudUserAuthDetailsService { private final UserMapper userMapper; private final SysSocialDetailsService socialDetailsService; /** * 用户密码登录 * * @param username 用户名 * @return * @throws UsernameNotFoundException */ @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User member = userMapper.selectOne(Wrappers.query(). lambda().eq(User::getUsername, username) .eq(User::getDelFlag, 0).ne(User::getRegisterType,2)); if (null == member) { throw new UsernameNotFoundException("用户账号不存在", null); } UserVO userVO = new UserVO(); BeanUtils.copyProperties(member, userVO); UserDetails userDetails = getUserDetails(userVO); return userDetails; } /** * 根据社交登录code 登录 * * @param inStr TYPE@CODE * @return UserDetails * @throws UsernameNotFoundException */ @Override public UserDetails loadUserBySocial(String inStr) { return getUserDetails(socialDetailsService.getUserInfo(inStr)); } @Override public void loadUserPermissions(Long userId) { // List roleIds = userMapper.listRolesByUserId(userId); // //设置权限列表(menu.permission) // Set permissions = new HashSet<>(); // Set permissionUrls = new HashSet<>(); // roleIds.forEach(roleId -> { // List permissionList = userMapper.listMenusByRoleId(roleId); // permissionList.stream().forEach(item->{ // permissions.add(item.getPermission()); // permissionUrls.add(item.getPath()); // }); // }); // // if(CollectionUtil.isNotEmpty(permissions)){ // permissions.removeIf(item->item ==null || "".equalsIgnoreCase(item)); // redisTemplate.opsForValue().set(SecurityConstants.CACHE_USER_PERMISSIONS_KEY +"key:"+ userId, permissions); // } // // if(CollectionUtil.isNotEmpty(permissionUrls)){ // List saveUrls = new ArrayList<>(); // permissionUrls.forEach(urls->{ // if(StringUtils.isNotEmpty(urls)){ // saveUrls.addAll(Arrays.asList(urls.split(","))); // } // }); // saveUrls.removeIf(item->item ==null || "".equalsIgnoreCase(item)); // redisTemplate.opsForValue().set(SecurityConstants.CACHE_USER_PERMISSIONS_KEY +"urls:"+ userId, saveUrls); // } } /** * 构建userdetails * * @param user 用户信息 * @return */ private UserDetails getUserDetails(UserVO user) { if (user == null) { throw new UsernameNotFoundException("用户不存在"); } boolean enabled = StrUtil.equals(user.getLockFlag(), CommonConstants.STATUS_NORMAL); // 构造security用户 Collection authorities = AuthorityUtils. createAuthorityList("GUEST"); return new MbCloudAuthUser(user.getId(), user.getPhone(), user.getAvatar(), user.getTenantId(), user.getUsername(), SecurityConstants.BCRYPT + user.getPassword(), enabled, true, true, !CommonConstants.STATUS_LOCK.equals(user.getLockFlag()), authorities); } }