1. 迁移 Role 相关的逻辑

This commit is contained in:
YunaiV
2021-01-09 11:27:11 +08:00
parent 4c3e2bd815
commit 9e59a6c1ae
23 changed files with 546 additions and 410 deletions

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -160,7 +160,7 @@ public class SysMenuServiceImpl implements SysMenuService {
// 标记删除
menuMapper.deleteById(menuId);
// 删除授予给角色的权限
permissionService.deleteRolesMenuByMenuId(menuId);
permissionService.processMenuDeleted(menuId);
}
@Override

View File

@@ -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 实现我
}

View File

@@ -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);
}
}
}