1. 迁移 Role 相关的逻辑
This commit is contained in:
@@ -5,22 +5,14 @@ import cn.hutool.core.util.StrUtil;
|
||||
import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.dashboard.framework.security.config.SecurityProperties;
|
||||
import cn.iocoder.dashboard.framework.security.core.LoginUser;
|
||||
import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthMenuRespVO;
|
||||
import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthPermissionInfoRespVO;
|
||||
import cn.iocoder.dashboard.modules.system.convert.auth.SysAuthConvert;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.redis.dao.auth.SysLoginUserRedisDAO;
|
||||
import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum;
|
||||
import cn.iocoder.dashboard.modules.system.enums.user.UserStatus;
|
||||
import cn.iocoder.dashboard.modules.system.service.auth.SysAuthService;
|
||||
import cn.iocoder.dashboard.modules.system.service.auth.SysTokenService;
|
||||
import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService;
|
||||
import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService;
|
||||
import cn.iocoder.dashboard.modules.system.service.user.SysUserService;
|
||||
import cn.iocoder.dashboard.util.collection.CollectionUtils;
|
||||
import cn.iocoder.dashboard.util.collection.SetUtils;
|
||||
import cn.iocoder.dashboard.util.date.DateUtils;
|
||||
import io.jsonwebtoken.Claims;
|
||||
import io.jsonwebtoken.JwtException;
|
||||
@@ -37,9 +29,8 @@ import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import static cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil.exception;
|
||||
@@ -64,8 +55,6 @@ public class SysAuthServiceImpl implements SysAuthService {
|
||||
@Resource
|
||||
private SysUserService userService;
|
||||
@Resource
|
||||
private SysRoleService roleService;
|
||||
@Resource
|
||||
private SysPermissionService permissionService;
|
||||
|
||||
@Resource
|
||||
@@ -92,7 +81,7 @@ public class SysAuthServiceImpl implements SysAuthService {
|
||||
// 创建 LoginUser 对象
|
||||
LoginUser loginUser = SysAuthConvert.INSTANCE.convert(user);
|
||||
loginUser.setUpdateTime(new Date());
|
||||
loginUser.setRoleIds(this.getUserRoleIds(loginUser.getUserId(), loginUser.getDeptId()));
|
||||
loginUser.setRoleIds(this.getUserRoleIds(loginUser.getUserId()));
|
||||
return loginUser;
|
||||
}
|
||||
|
||||
@@ -106,7 +95,7 @@ public class SysAuthServiceImpl implements SysAuthService {
|
||||
// 缓存登陆用户到 Redis 中
|
||||
String sessionId = IdUtil.fastSimpleUUID();
|
||||
loginUser.setUpdateTime(new Date());
|
||||
loginUser.setRoleIds(this.getUserRoleIds(loginUser.getUserId(), loginUser.getDeptId()));
|
||||
loginUser.setRoleIds(this.getUserRoleIds(loginUser.getUserId()));
|
||||
loginUserRedisDAO.set(sessionId, loginUser);
|
||||
|
||||
// 创建 Token
|
||||
@@ -156,15 +145,10 @@ public class SysAuthServiceImpl implements SysAuthService {
|
||||
* 获得 User 拥有的角色编号数组
|
||||
*
|
||||
* @param userId 用户编号
|
||||
* @param deptId 科室编号
|
||||
* @return 角色编号数组
|
||||
*/
|
||||
private Set<Long> getUserRoleIds(Long userId, Long deptId) {
|
||||
// 用户拥有的角色
|
||||
Set<Long> roleIds = new HashSet<>(permissionService.listUserRoleIds(userId));
|
||||
// 部门拥有的角色
|
||||
CollectionUtils.addIfNotNull(roleIds, permissionService.getDeptRoleId(deptId));
|
||||
return roleIds;
|
||||
private Set<Long> getUserRoleIds(Long userId) {
|
||||
return permissionService.listUserRoleIds(userId, Collections.singleton(CommonStatusEnum.ENABLE.getStatus()));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -222,7 +206,7 @@ public class SysAuthServiceImpl implements SysAuthService {
|
||||
// 刷新 LoginUser 缓存
|
||||
loginUser.setDeptId(user.getDeptId());
|
||||
loginUser.setUpdateTime(new Date());
|
||||
loginUser.setRoleIds(this.getUserRoleIds(loginUser.getUserId(), loginUser.getDeptId()));
|
||||
loginUser.setRoleIds(this.getUserRoleIds(loginUser.getUserId()));
|
||||
loginUserRedisDAO.set(sessionId, loginUser);
|
||||
}
|
||||
|
||||
|
||||
@@ -2,8 +2,10 @@ package cn.iocoder.dashboard.modules.system.service.permission;
|
||||
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* 权限 Service 接口
|
||||
@@ -33,26 +35,26 @@ public interface SysPermissionService {
|
||||
Collection<Integer> menusStatuses);
|
||||
|
||||
/**
|
||||
* 获得用户拥有的角色编号数组
|
||||
* 获得用户拥有的角色编号集合
|
||||
*
|
||||
* @param userId 用户编号
|
||||
* @return 角色编号数组
|
||||
* @param roleStatuses 角色状态集合. 允许为空,为空时不过滤
|
||||
* @return 角色编号集合
|
||||
*/
|
||||
List<Long> listUserRoleIds(Long userId);
|
||||
Set<Long> listUserRoleIds(Long userId, @Nullable Collection<Integer> roleStatuses);
|
||||
|
||||
/**
|
||||
* 获得部门拥有的角色编号
|
||||
* 处理角色删除时,删除关联授权角色
|
||||
*
|
||||
* @param deptId 部门编号
|
||||
* @return 角色编号
|
||||
* @param roleId 角色编号
|
||||
*/
|
||||
Long getDeptRoleId(Long deptId);
|
||||
void processRoleDeleted(Long roleId);
|
||||
|
||||
/**
|
||||
* 删除授予给角色的菜单们
|
||||
* 处理菜单删除时,删除关联授权数据
|
||||
*
|
||||
* @param menuId 菜单编号
|
||||
*/
|
||||
void deleteRolesMenuByMenuId(Long menuId);
|
||||
void processMenuDeleted(Long menuId);
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
package cn.iocoder.dashboard.modules.system.service.permission;
|
||||
|
||||
import cn.iocoder.dashboard.common.pojo.PageResult;
|
||||
import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleCreateReqVO;
|
||||
import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRolePageReqVO;
|
||||
import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
|
||||
|
||||
import java.util.Collection;
|
||||
@@ -17,13 +21,21 @@ public interface SysRoleService {
|
||||
*/
|
||||
void init();
|
||||
|
||||
/**
|
||||
* 获得角色,从缓存中
|
||||
*
|
||||
* @param id 角色编号
|
||||
* @return 角色
|
||||
*/
|
||||
SysRoleDO getRoleFromCache(Long id);
|
||||
|
||||
/**
|
||||
* 获得角色数组,从缓存中
|
||||
*
|
||||
* @param roleIds 角色编号数组
|
||||
* @param ids 角色编号数组
|
||||
* @return 角色数组
|
||||
*/
|
||||
List<SysRoleDO> listRolesFromCache(Collection<Long> roleIds);
|
||||
List<SysRoleDO> listRolesFromCache(Collection<Long> ids);
|
||||
|
||||
/**
|
||||
* 判断角色数组中,是否有管理员
|
||||
@@ -33,4 +45,50 @@ public interface SysRoleService {
|
||||
*/
|
||||
boolean hasAnyAdmin(Collection<SysRoleDO> roleList);
|
||||
|
||||
/**
|
||||
* 创建角色
|
||||
*
|
||||
* @param reqVO 创建角色信息
|
||||
* @return 角色编号
|
||||
*/
|
||||
Long createRole(SysRoleCreateReqVO reqVO);
|
||||
|
||||
/**
|
||||
* 更新角色
|
||||
*
|
||||
* @param reqVO 更新角色信息
|
||||
*/
|
||||
void updateRole(SysRoleUpdateReqVO reqVO);
|
||||
|
||||
/**
|
||||
* 删除角色
|
||||
*
|
||||
* @param id 角色编号
|
||||
*/
|
||||
void deleteRole(Long id);
|
||||
|
||||
/**
|
||||
* 获得角色
|
||||
*
|
||||
* @param id 角色编号
|
||||
* @return 角色
|
||||
*/
|
||||
SysRoleDO getRole(Long id);
|
||||
|
||||
/**
|
||||
* 获得角色分页
|
||||
*
|
||||
* @param reqVO 角色分页查询
|
||||
* @return 角色分页结果
|
||||
*/
|
||||
PageResult<SysRoleDO> pageRole(SysRolePageReqVO reqVO);
|
||||
|
||||
/**
|
||||
* 更新角色状态
|
||||
*
|
||||
* @param id 角色编号
|
||||
* @param status 状态
|
||||
*/
|
||||
void updateRoleStatus(Long id, Integer status);
|
||||
|
||||
}
|
||||
|
||||
@@ -160,7 +160,7 @@ public class SysMenuServiceImpl implements SysMenuService {
|
||||
// 标记删除
|
||||
menuMapper.deleteById(menuId);
|
||||
// 删除授予给角色的权限
|
||||
permissionService.deleteRolesMenuByMenuId(menuId);
|
||||
permissionService.processMenuDeleted(menuId);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
package cn.iocoder.dashboard.modules.system.service.permission.impl;
|
||||
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission.SysRoleDeptMapper;
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission.SysRoleMenuMapper;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission.SysUserRoleMapper;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.*;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleMenuDO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysUserRoleDO;
|
||||
import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService;
|
||||
import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService;
|
||||
import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService;
|
||||
@@ -19,11 +22,12 @@ import javax.annotation.Resource;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* 权限 Service 实现类
|
||||
*
|
||||
* @author 初始化
|
||||
* @author 芋道源码
|
||||
*/
|
||||
@Service
|
||||
@Slf4j
|
||||
@@ -50,8 +54,6 @@ public class SysPermissionServiceImpl implements SysPermissionService {
|
||||
private SysRoleMenuMapper roleMenuMapper;
|
||||
@Resource
|
||||
private SysUserRoleMapper userRoleMapper;
|
||||
@Resource
|
||||
private SysRoleDeptMapper roleDeptMapper;
|
||||
|
||||
@Resource
|
||||
private SysRoleService roleService;
|
||||
@@ -96,19 +98,29 @@ public class SysPermissionServiceImpl implements SysPermissionService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Long> listUserRoleIds(Long userId) {
|
||||
public Set<Long> listUserRoleIds(Long userId, Collection<Integer> roleStatuses) {
|
||||
List<SysUserRoleDO> userRoleList = userRoleMapper.selectListByUserId(userId);
|
||||
return CollectionUtils.convertList(userRoleList, SysUserRoleDO::getRoleId);
|
||||
// 过滤角色状态
|
||||
if (CollectionUtil.isNotEmpty(roleStatuses)) {
|
||||
userRoleList.removeIf(userRoleDO -> {
|
||||
SysRoleDO role = roleService.getRoleFromCache(userRoleDO.getRoleId());
|
||||
return role == null || !roleStatuses.contains(role.getStatus());
|
||||
});
|
||||
}
|
||||
return CollectionUtils.convertSet(userRoleList, SysUserRoleDO::getRoleId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getDeptRoleId(Long deptId) {
|
||||
SysRoleDeptDO roleDept = roleDeptMapper.selectById(deptId);
|
||||
return roleDept != null ? roleDept.getRoleId() : null;
|
||||
public void processRoleDeleted(Long roleId) {
|
||||
// TODO 实现我
|
||||
// // 标记删除 RoleResource
|
||||
// roleResourceMapper.deleteByRoleId(roleId);
|
||||
// // 标记删除 AdminRole
|
||||
// adminRoleMapper.deleteByRoleId(roleId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteRolesMenuByMenuId(Long menuId) {
|
||||
public void processMenuDeleted(Long menuId) {
|
||||
// TODO 实现我
|
||||
}
|
||||
|
||||
|
||||
@@ -1,13 +1,24 @@
|
||||
package cn.iocoder.dashboard.modules.system.service.permission.impl;
|
||||
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil;
|
||||
import cn.iocoder.dashboard.common.pojo.PageResult;
|
||||
import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleCreateReqVO;
|
||||
import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRolePageReqVO;
|
||||
import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO;
|
||||
import cn.iocoder.dashboard.modules.system.convert.permission.SysRoleConvert;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission.SysRoleMapper;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
|
||||
import cn.iocoder.dashboard.modules.system.enums.permission.RoleCodeEnum;
|
||||
import cn.iocoder.dashboard.modules.system.enums.permission.RoleTypeEnum;
|
||||
import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService;
|
||||
import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.annotation.Resource;
|
||||
@@ -17,13 +28,20 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
|
||||
|
||||
/**
|
||||
* 角色 Service 实现类
|
||||
*
|
||||
* @author 芋道源码
|
||||
*/
|
||||
@Service
|
||||
@Slf4j
|
||||
public class SysRoleServiceImpl implements SysRoleService {
|
||||
|
||||
@Resource
|
||||
private SysPermissionService permissionService;
|
||||
|
||||
@Resource
|
||||
private SysRoleMapper roleMapper;
|
||||
|
||||
@@ -51,11 +69,16 @@ public class SysRoleServiceImpl implements SysRoleService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SysRoleDO> listRolesFromCache(Collection<Long> roleIds) {
|
||||
if (CollectionUtil.isEmpty(roleIds)) {
|
||||
public SysRoleDO getRoleFromCache(Long id) {
|
||||
return roleCache.get(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SysRoleDO> listRolesFromCache(Collection<Long> ids) {
|
||||
if (CollectionUtil.isEmpty(ids)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return roleCache.values().stream().filter(roleDO -> roleIds.contains(roleDO.getId()))
|
||||
return roleCache.values().stream().filter(roleDO -> ids.contains(roleDO.getId()))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@@ -67,4 +90,104 @@ public class SysRoleServiceImpl implements SysRoleService {
|
||||
return roleList.stream().anyMatch(roleDO -> RoleCodeEnum.ADMIN.getKey().equals(roleDO.getCode()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long createRole(SysRoleCreateReqVO reqVO) {
|
||||
// 校验角色
|
||||
checkDuplicateRole(reqVO.getName(), reqVO.getCode(), null);
|
||||
// 插入到数据库
|
||||
SysRoleDO role = SysRoleConvert.INSTANCE.convert(reqVO);
|
||||
role.setType(RoleTypeEnum.CUSTOM.getType());
|
||||
role.setStatus(CommonStatusEnum.ENABLE.getStatus());
|
||||
roleMapper.insert(role);
|
||||
// 返回
|
||||
return role.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateRole(SysRoleUpdateReqVO reqVO) {
|
||||
// 校验更新的角色是否存在
|
||||
SysRoleDO role = roleMapper.selectById(reqVO.getId());
|
||||
if (roleMapper.selectById(reqVO.getId()) == null) {
|
||||
throw ServiceExceptionUtil.exception(ROLE_NOT_EXISTS);
|
||||
}
|
||||
// 内置角色,不允许修改
|
||||
if (RoleTypeEnum.SYSTEM.getType().equals(role.getType())) {
|
||||
throw ServiceExceptionUtil.exception(ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE);
|
||||
}
|
||||
// 校验角色的唯一字段是否重复
|
||||
checkDuplicateRole(reqVO.getName(), reqVO.getCode(), reqVO.getId());
|
||||
// 更新到数据库
|
||||
SysRoleDO updateObject = SysRoleConvert.INSTANCE.convert(reqVO);
|
||||
roleMapper.updateById(updateObject);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteRole(Long id) {
|
||||
// 校验删除的角色是否存在
|
||||
SysRoleDO roleDO = roleMapper.selectById(id);
|
||||
if (roleMapper.selectById(id) == null) {
|
||||
throw ServiceExceptionUtil.exception(ROLE_NOT_EXISTS);
|
||||
}
|
||||
// 内置角色,不允许删除
|
||||
if (RoleTypeEnum.SYSTEM.getType().equals(roleDO.getType())) {
|
||||
throw ServiceExceptionUtil.exception(ROLE_CAN_NOT_DELETE_SYSTEM_TYPE_ROLE);
|
||||
}
|
||||
// 标记删除
|
||||
roleMapper.deleteById(id);
|
||||
// 删除相关数据
|
||||
permissionService.processRoleDeleted(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SysRoleDO getRole(Long id) {
|
||||
return roleMapper.selectById(id);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public PageResult<SysRoleDO> pageRole(SysRolePageReqVO reqVO) {
|
||||
IPage<SysRoleDO> roleDOPage = roleMapper.selectPage(reqVO);
|
||||
return SysRoleConvert.INSTANCE.convertPage(roleDOPage);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateRoleStatus(Long id, Integer status) {
|
||||
// 校验修改的角色是否存在
|
||||
SysRoleDO roleDO = roleMapper.selectById(id);
|
||||
if (roleMapper.selectById(id) == null) {
|
||||
throw ServiceExceptionUtil.exception(ROLE_NOT_EXISTS);
|
||||
}
|
||||
SysRoleDO updateObject = new SysRoleDO();
|
||||
updateObject.setId(id);
|
||||
updateObject.setStatus(status);
|
||||
roleMapper.updateById(updateObject);
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验角色的唯一字段是否重复
|
||||
*
|
||||
* 1. 是否存在相同名字的角色
|
||||
* 2. 是否存在相同编码的角色
|
||||
*
|
||||
* @param name 角色名字
|
||||
* @param code 角色额编码
|
||||
* @param id 角色编号
|
||||
*/
|
||||
private void checkDuplicateRole(String name, String code, Long id) {
|
||||
// 1. 该 name 名字被其它角色所使用
|
||||
SysRoleDO role = roleMapper.selectByName(name);
|
||||
if (role != null && !role.getId().equals(id)) {
|
||||
throw ServiceExceptionUtil.exception(ROLE_NAME_DUPLICATE, name);
|
||||
}
|
||||
// 2. 是否存在相同编码的角色
|
||||
if (!StringUtils.hasText(code)) {
|
||||
return;
|
||||
}
|
||||
// 该 code 编码被其它角色所使用
|
||||
role = roleMapper.selectByCode(code);
|
||||
if (role != null && !role.getId().equals(id)) {
|
||||
throw ServiceExceptionUtil.exception(ROLE_CODE_DUPLICATE, name);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user