SYYTe/fast-boot-system/src/main/java/net/maku/security/service/FastUserDetailsService.java
2022-04-22 15:26:39 +08:00

112 lines
4.1 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package net.maku.security.service;
import lombok.AllArgsConstructor;
import net.maku.framework.common.exception.ErrorCode;
import net.maku.framework.common.exception.FastException;
import net.maku.framework.security.user.UserDetail;
import net.maku.system.convert.SysUserConvert;
import net.maku.system.dao.SysRoleDao;
import net.maku.system.dao.SysRoleDataScopeDao;
import net.maku.system.dao.SysUserDao;
import net.maku.system.entity.SysUserEntity;
import net.maku.system.enums.DataScopeEnum;
import net.maku.system.enums.UserStatusEnum;
import net.maku.system.service.SysMenuService;
import net.maku.system.service.SysOrgService;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* UserDetailsService
*
* @author 阿沐 babamu@126.com
*/
@Service
@AllArgsConstructor
public class FastUserDetailsService implements UserDetailsService {
private final SysMenuService sysMenuService;
private final SysOrgService sysOrgService;
private final SysUserDao sysUserDao;
private final SysRoleDao sysRoleDao;
private final SysRoleDataScopeDao sysRoleDataScopeDao;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
SysUserEntity userEntity = sysUserDao.getByUsername(username);
if(userEntity == null) {
throw new FastException(ErrorCode.ACCOUNT_PASSWORD_ERROR);
}
// 转换成UserDetail对象
UserDetail userDetail = SysUserConvert.INSTANCE.convertDetail(userEntity);
// 告诉spring-security密码使用的bcrypt加密
userDetail.setPassword(String.format("{bcrypt}%s", userDetail.getPassword()));
// 账号不可用
if(userEntity.getStatus() == UserStatusEnum.DISABLE.getValue()){
userDetail.setEnabled(false);
}
// 数据权限范围
List<Long> dataScopeList = getDataScope(userDetail);
userDetail.setDataScopeList(dataScopeList);
// 用户权限列表
Set<GrantedAuthority> authorities = getUserAuthority(userDetail);
userDetail.setAuthorities(authorities);
return userDetail;
}
private List<Long> getDataScope(UserDetail userDetail){
Integer dataScope = sysRoleDao.getDataScopeByUserId(userDetail.getId());
if (dataScope == null){
return new ArrayList<>();
}
if (dataScope.equals(DataScopeEnum.ALL.getValue())) {
// 全部数据权限则返回null
return null;
} else if (dataScope.equals(DataScopeEnum.DEPT_AND_CHILD.getValue())) {
// 本部门及子部门数据
List<Long> dataScopeList = sysOrgService.getSubOrgIdList(userDetail.getOrgId());
// 自定义数据权限范围
dataScopeList.addAll(sysRoleDataScopeDao.getDataScopeList(userDetail.getId()));
return dataScopeList;
} else if (dataScope.equals(DataScopeEnum.DEPT_ONLY.getValue())) {
// 本部门数据
List<Long> dataScopeList = new ArrayList<>();
dataScopeList.add(userDetail.getOrgId());
// 自定义数据权限范围
dataScopeList.addAll(sysRoleDataScopeDao.getDataScopeList(userDetail.getId()));
return dataScopeList;
}
return new ArrayList<>();
}
private Set<GrantedAuthority> getUserAuthority(UserDetail user) {
// 获取用户权限标识
Set<String> permsSet = sysMenuService.getUserAuthority(user);
// 封装权限标识
Set<GrantedAuthority> authorities = new HashSet<>();
authorities.addAll(permsSet.stream().map(SimpleGrantedAuthority::new).collect(Collectors.toSet()));
return authorities;
}
}