refactor: 对权限组的重新配置

This commit is contained in:
筱锋xiao_lfeng 2024-04-16 23:56:20 +08:00
parent f0f6e53ba2
commit a2cd19675e
Signed by: XiaoLFeng
GPG Key ID: F693AA12AABBFA87
27 changed files with 170 additions and 507 deletions

View File

@ -14,7 +14,7 @@ import java.lang.annotation.*;
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NeedRoleGroup {
public @interface NeedPermission {
/**
* <h2>权限名称</h2>
* <hr/>

View File

@ -31,7 +31,7 @@ public class CheckUserAbleToUseAspect {
private final UserDAO userDAO;
@Around("@annotation(com.jsl.oa.annotations.NeedRoleGroup)")
@Around("@annotation(com.jsl.oa.annotations.NeedPermission)")
public Object checkUse(ProceedingJoinPoint pjp) throws Throwable {
// 从ServletRequest中获取用户信息
ServletRequestAttributes servletRequestAttributes =

View File

@ -1,6 +1,8 @@
package com.jsl.oa.aspect;
import com.jsl.oa.annotations.NeedRoleGroup;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.jsl.oa.annotations.NeedPermission;
import com.jsl.oa.dao.RoleDAO;
import com.jsl.oa.exception.library.NotLoginException;
import com.jsl.oa.exception.library.PermissionDeniedException;
@ -16,14 +18,16 @@ import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.util.List;
/**
* 检查用户权限切面
* <hr/>
* 检查访问的用户是否包含正确的访问权限若用户有正确的访问权限则允许访问若没有指定的权限将会返回错误的权限信息
*
* @since v1.2.0
* @version v1.2.0
* @author xiao_lfeng
* @version v1.2.0
* @since v1.2.0
*/
@Slf4j
@Aspect
@ -32,6 +36,7 @@ import org.springframework.web.context.request.ServletRequestAttributes;
public class CheckUserPermissionAspect {
private final RoleDAO roleDAO;
private final Gson gson;
/**
* 检查权限
@ -41,7 +46,7 @@ public class CheckUserPermissionAspect {
* @param pjp {@link ProceedingJoinPoint}
* @return {@link Object}
*/
@Around("@annotation(com.jsl.oa.annotations.NeedRoleGroup)")
@Around("@annotation(com.jsl.oa.annotations.NeedPermission)")
public Object checkPermission(ProceedingJoinPoint pjp) throws Throwable {
// 从ServletRequest中获取用户信息
ServletRequestAttributes servletRequestAttributes =
@ -55,20 +60,23 @@ public class CheckUserPermissionAspect {
}
// 获取方法签名
MethodSignature signature = (MethodSignature) pjp.getSignature();
NeedRoleGroup checkAccountPermission = signature.getMethod().getAnnotation(NeedRoleGroup.class);
NeedPermission checkAccountPermission = signature.getMethod().getAnnotation(NeedPermission.class);
String getRoleAtAnnotation = checkAccountPermission.value();
// 获取用户所在权限组
RoleDO getUserRole = roleDAO.getRoleNameByUid(getUserId);
if (getUserRole != null) {
if (getUserRole.getRoleName().equals(getRoleAtAnnotation)) {
return pjp.proceed();
} else {
throw new PermissionDeniedException("用户组不匹配", getRoleAtAnnotation);
List<String> permissions = gson.fromJson(getUserRole.getPermissions(), new TypeToken<List<String>>() {
}.getType());
if (permissions != null) {
for (String it : permissions) {
if (it.equals(getRoleAtAnnotation)) {
return pjp.proceed();
}
}
}
} else {
throw new PermissionDeniedException("用户组不匹配", getRoleAtAnnotation);
}
throw new PermissionDeniedException("权限不匹配", getRoleAtAnnotation);
} else {
throw new RuntimeException("无法获取信息");
}

View File

@ -73,7 +73,6 @@ public class StartupConfiguration {
prepareData.checkDatabase("oa_message");
prepareData.checkDatabase("oa_news_user");
prepareData.checkDatabase("oa_project_daily");
prepareData.checkDatabase("oa_role_permissions");
prepareData.checkDatabase("oa_role_user");
prepareData.checkDatabase("oa_user_tags");
};

View File

@ -1,16 +1,14 @@
package com.jsl.oa.controllers;
import com.jsl.oa.model.vodata.PermissionEditVO;
import com.jsl.oa.services.PermissionService;
import com.jsl.oa.utils.BaseResponse;
import com.jsl.oa.utils.ErrorCode;
import com.jsl.oa.utils.Processing;
import com.jsl.oa.utils.ResultUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@ -30,24 +28,6 @@ public class PermissionController {
*/
private final PermissionService permissionService;
/**
* 添加新的权限
*
* @param request HTTP请求对象
* @param rid 角色ID
* @param pid 权限ID
* @return {@link BaseResponse} 对象包含操作结果
*/
@PostMapping("/permission/add")
public BaseResponse permissionAdd(HttpServletRequest request, @RequestParam Long rid, @RequestParam Long pid) {
// 判断是否有参数错误
if (rid == null || pid == null) {
return ResultUtil.error(ErrorCode.PARAMETER_ERROR);
} else {
return permissionService.permissionAdd(request, rid, pid);
}
}
/**
* 获取当前用户的权限信息
*
@ -75,42 +55,4 @@ public class PermissionController {
public BaseResponse permissionGet(HttpServletRequest request) {
return permissionService.permissionGet(request);
}
/**
* 编辑权限信息
*
* @param permissionEditVo {@link PermissionEditVO} 对象包含更新后的权限信息
* @param bindingResult Binding结果对象包含任何验证错误
* @param request HTTP请求对象
* @return {@link BaseResponse} 对象包含操作结果
*/
@PutMapping("/permission/edit")
public BaseResponse permissionEdit(
@RequestBody @Validated PermissionEditVO permissionEditVo,
BindingResult bindingResult,
HttpServletRequest request
) {
// 判断是否有参数错误
if (bindingResult.hasErrors()) {
return ResultUtil.error(ErrorCode.REQUEST_BODY_ERROR, Processing.getValidatedErrorList(bindingResult));
}
return permissionService.permissionEdit(permissionEditVo, request);
}
/**
* 删除权限
*
* @param pid 权限ID
* @param request HTTP请求对象
* @return {@link BaseResponse} 对象包含操作结果
*/
@DeleteMapping("/permission/delete")
public BaseResponse permissionDelete(@RequestParam Long pid, HttpServletRequest request) {
// 判断是否有参数错误
if (pid == null) {
return ResultUtil.error(ErrorCode.PARAMETER_ERROR);
} else {
return permissionService.permissionDelete(request, pid);
}
}
}

View File

@ -4,7 +4,9 @@ import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.jsl.oa.common.constant.BusinessConstants;
import com.jsl.oa.mapper.PermissionMapper;
import com.jsl.oa.mapper.RoleMapper;
import com.jsl.oa.model.dodata.PermissionDO;
import com.jsl.oa.model.dodata.RoleDO;
import com.jsl.oa.utils.redis.RoleRedisUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -30,6 +32,7 @@ public class PermissionDAO {
private final PermissionMapper permissionMapper;
private final RoleRedisUtil<String> roleRedisUtil;
private final Gson gson;
private final RoleMapper roleMapper;
/**
* <h2>获取用户权限信息</h2>
@ -40,12 +43,13 @@ public class PermissionDAO {
* @return {@link List<String>}
*/
public List<String> getPermission(@NotNull Long uid) {
// 查询用户所在角色组
RoleDO getRole = roleMapper.getRoleByUserId(uid);
List<String> getPermissionForString;
String permissionRedisString = roleRedisUtil.getData(BusinessConstants.NONE, uid.toString());
if (permissionRedisString == null) {
List<PermissionDO> permissionList = permissionMapper.permissionUserPid(uid);
getPermissionForString = new ArrayList<>();
forPermissionToBuildString(permissionList, getPermissionForString);
String permissionList = permissionMapper.getPermissionByRole(getRole.getRoleName());
getPermissionForString = gson.fromJson(permissionList, new TypeToken<List<String>>() { }.getType());
// 存入 Redis
roleRedisUtil.setData(BusinessConstants.NONE, uid.toString(), gson.toJson(getPermissionForString), 1440);
} else {
@ -55,127 +59,25 @@ public class PermissionDAO {
}
public List<String> getAllPermissionBuildString() {
List<String> getPermissionForString;
List<String> getPermission;
String getRedisData = roleRedisUtil.getData(BusinessConstants.ALL_PERMISSION, "string");
if (getRedisData == null) {
getPermission = new ArrayList<>();
List<PermissionDO> permissionList = permissionMapper.getAllPermission();
permissionList.removeIf(it -> it.getPid() != null);
getPermissionForString = new ArrayList<>();
forPermissionToBuildString(permissionList, getPermissionForString);
permissionList.forEach(it -> getPermission.add(it.getName()));
// 存入 Redis
roleRedisUtil.setData(
BusinessConstants.ALL_PERMISSION,
"string",
gson.toJson(getPermissionForString),
gson.toJson(permissionList),
1440);
} else {
getPermissionForString = gson.fromJson(getRedisData, new TypeToken<List<String>>() { }.getType());
getPermission = gson.fromJson(getRedisData, new TypeToken<List<String>>() { }.getType());
}
return getPermissionForString;
return getPermission;
}
public List<PermissionDO> getRootPermission() {
String getRedisData = roleRedisUtil.getData(BusinessConstants.ALL_PERMISSION, "all");
if (getRedisData == null) {
List<PermissionDO> permissionList = permissionMapper.getAllPermission();
if (!permissionList.isEmpty()) {
List<PermissionDO> getPermissionList = new ArrayList<>();
for (PermissionDO permission : permissionList) {
if (permission.getPid() == null) {
getPermissionList.add(permission);
}
}
roleRedisUtil.setData(BusinessConstants.ALL_PERMISSION, "all", gson.toJson(getPermissionList), 1440);
return getPermissionList;
} else {
return null;
}
} else {
return gson.fromJson(getRedisData, new TypeToken<List<PermissionDO>>() {
}.getType());
}
}
/**
* <h2>获取全部权限信息</h2>
* <hr/>
* 获取全部权限信息
*
* @param permissionList 权限信息
* @param getPermissionForString 存储权限信息
*/
private void forPermissionToBuildString(
@NotNull List<PermissionDO> permissionList,
List<String> getPermissionForString) {
for (PermissionDO permission : permissionList) {
// 寻找是否存在父亲
StringBuilder permissionString = new StringBuilder();
if (permission.getPid() != null) {
// 存在父亲
this.getFatherPermission(permissionString, permission.getPid());
} else {
// 不存在父亲
permissionString.append(permission.getName());
}
// 寻找子类
this.getChildPermission(permissionString, permission.getId(), getPermissionForString);
getPermissionForString.add(permissionString.toString());
}
}
/**
* <h2>获取子类权限信息</h2>
* <hr/>
* 通过父类 ID 获取子类权限信息<br/>
* 递归调用
*
* @param permissionString 父类权限信息
* @param id 父类 ID
* @param getPermissionForString 存储权限信息
*/
private void getChildPermission(StringBuilder permissionString, Long id, List<String> getPermissionForString) {
// 获取子类权限信息
List<PermissionDO> permissionList = permissionMapper.getChildPermission(id);
// 判断是否存在子类
if (!permissionList.isEmpty()) {
// 存在子类
for (PermissionDO permission : permissionList) {
StringBuilder childPermissionString = new StringBuilder(permissionString);
// 遍历数据检查是否依旧存在子类
List<PermissionDO> childPermissionList = permissionMapper.getChildPermission(permission.getId());
if (!childPermissionList.isEmpty()) {
// 存在子类
permissionString.append(".").append(permission.getName());
this.getChildPermission(permissionString, permission.getId(), getPermissionForString);
} else {
// 不存在子类
permissionString.append(".").append(permission.getName());
getPermissionForString.add(permissionString.toString());
}
permissionString = childPermissionString;
}
}
}
/**
* <h2>获取父类权限信息</h2>
* <hr/>
* 通过子类 ID 获取父类权限信息<br/>
* 递归调用
*
* @param permissionString 父类权限信息
* @param pid 父类 ID
*/
public void getFatherPermission(StringBuilder permissionString, Long pid) {
// 获取权限信息
PermissionDO permissionDO = permissionMapper.getPermissionById(pid);
// 判断是否存在父亲
if (permissionDO.getPid() != null) {
// 存在父亲
this.getFatherPermission(permissionString, permissionDO.getPid());
} else {
// 不存在父亲
permissionString.append(permissionDO.getCode());
}
public List<PermissionDO> getAllPermission() {
return permissionMapper.getAllPermission();
}
}

View File

@ -134,4 +134,8 @@ public class RoleDAO {
public RoleDO getRoleByRoleName(String roleName) {
return roleMapper.getRoleByRoleName(roleName);
}
public RoleDO getRoleByUserId(Long uid) {
return roleMapper.getRoleByUserId(uid);
}
}

View File

@ -123,7 +123,7 @@ public class UserDAO {
userCurrentBackVO.setUsers(new ArrayList<>())
.setCount(userMapper.getUsersCount());
userCurrentDO.forEach(it -> userCurrentBackVO.getUsers()
.add(Processing.returnUserInfo(it, roleDAO, permissionDAO)));
.add(Processing.returnUserInfo(it, roleDAO, gson)));
return userCurrentBackVO;
}
@ -134,7 +134,7 @@ public class UserDAO {
userCurrentBackVO.setUsers(new ArrayList<>())
.setCount(userMapper.getUsersCount());
userCurrentDO.forEach(it -> userCurrentBackVO.getUsers()
.add(Processing.returnUserInfo(it, roleDAO, permissionDAO)));
.add(Processing.returnUserInfo(it, roleDAO, gson)));
return userCurrentBackVO;
}

View File

@ -1,5 +1,6 @@
package com.jsl.oa.exception;
import com.jsl.oa.exception.library.PermissionDeniedException;
import com.jsl.oa.utils.BaseResponse;
import com.jsl.oa.utils.ErrorCode;
import com.jsl.oa.utils.ResultUtil;
@ -103,4 +104,10 @@ public class ProcessException {
log.error(e.getMessage(), e);
return ResultUtil.error("ServerInternalError", 50002, "服务器内部错误");
}
@ExceptionHandler(value = PermissionDeniedException.class)
public BaseResponse businessPermissionDeniedException(PermissionDeniedException e) {
log.warn("[EXCEPTION] 无权限操作,需要权限: {}", e.getNeedPermission());
return ResultUtil.error("需要权限: " + e.getNeedPermission(), ErrorCode.PERMISSION_NOT_EXIST);
}
}

View File

@ -13,10 +13,10 @@ import lombok.Getter;
*/
@Getter
public class PermissionDeniedException extends RuntimeException {
private final String needGroup;
private final String needPermission;
public PermissionDeniedException(String message, String needGroup) {
public PermissionDeniedException(String message, String needPermission) {
super(message);
this.needGroup = needGroup;
this.needPermission = needPermission;
}
}

View File

@ -1,44 +1,17 @@
package com.jsl.oa.mapper;
import com.jsl.oa.model.dodata.PermissionDO;
import com.jsl.oa.model.dodata.RolePermissionDO;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface PermissionMapper {
@Insert("INSERT INTO organize_oa.oa_role_permissions(rid, pid) VALUE (#{rid},#{pid})")
void permissionAdd(Long rid, Long pid);
@Select("SELECT * FROM organize_oa.oa_permissions WHERE id IN "
+ "(SELECT pid FROM organize_oa.oa_role_permissions WHERE rid IN "
+ "(SELECT rid FROM organize_oa.oa_role_user WHERE uid = #{uid}))")
List<PermissionDO> permissionUserPid(Long uid);
@Select("SELECT * FROM organize_oa.oa_permissions where id=#{id}")
PermissionDO getPermissionById(Long id);
@Select("SELECT * FROM organize_oa.oa_role_permissions where pid=#{pid}")
RolePermissionDO rolePermissionGetByPid(Long pid);
@Select("SELECT * FROM organize_oa.oa_permissions")
List<PermissionDO> getAllPermission();
@Update("UPDATE organize_oa.oa_permissions SET pid = #{pid}, name = #{name}, code = #{code}, "
+ "type = #{type} WHERE id = #{id}")
boolean updatePermission(PermissionDO permissionDO);
@Delete("DELETE FROM organize_oa.oa_permissions where id=#{pid}")
boolean deletePermission(Long pid);
@Select("SELECT * FROM organize_oa.oa_permissions WHERE id IN (#{permissionList})")
List<PermissionDO> permissionGet(String permissionList);
@Select("SELECT * FROM organize_oa.oa_permissions WHERE id = #{pid}")
PermissionDO getPermissionByPid(Long pid);
@Select("SELECT * FROM organize_oa.oa_permissions WHERE pid = #{id}")
List<PermissionDO> getChildPermission(Long id);
@Select("SELECT permissions FROM organize_oa.oa_role WHERE role_name = #{roleName}")
String getPermissionByRole(String roleName);
}

View File

@ -40,8 +40,6 @@ public interface RoleMapper {
@Delete("DELETE FROM organize_oa.oa_role WHERE id=#{id}")
boolean roleDelete(Long id);
@Select("SELECT * FROM organize_oa.oa_role WHERE id = (SELECT rid FROM organize_oa.oa_role_user WHERE uid=#{uid})")
RoleDO getRoleByUserId(Long uid);
}

View File

@ -19,10 +19,12 @@ import java.sql.Timestamp;
@Accessors(chain = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class PermissionDO {
// 主键
private Long id;
private Long pid;
// 权限名称
private String name;
private String code;
private Short type;
private Timestamp deletedAt;
// 权限描述
private String description;
// 创建时间
private Timestamp createdAt;
}

View File

@ -12,14 +12,21 @@ import java.sql.Timestamp;
*
* @author 筱锋xiao_lfeng
* @since v1.1.0
* @version v1.1.0
* @version v1.2.0
*/
@Data
@Accessors(chain = true)
public class RoleDO {
// 角色id
private Long id;
// 角色名称
private String roleName;
// 中文描述
private String displayName;
// 用户组权限
private String permissions;
// 创建时间
private Timestamp createdAt;
// 修改时间
private Timestamp updatedAt;
}

View File

@ -1,25 +0,0 @@
package com.jsl.oa.model.dodata;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import lombok.experimental.Accessors;
import java.sql.Timestamp;
/**
* <h1>role 数据表</h1>
* <hr/>
* 映射 oa_role 数据表内容进入自定义实体类
*
* @author 筱锋xiao_lfeng
* @since v1.1.0
* @version v1.1.0
*/
@Data
@Accessors(chain = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class RolePermissionDO {
private Long rid;
private Long pid;
private Timestamp createdAt;
}

View File

@ -0,0 +1,14 @@
package com.jsl.oa.model.vodata;
import lombok.Data;
@Data
public class PermissionContentVO {
// 主键
private Long id;
// 权限名称
private String name;
// 权限描述
private String description;
}

View File

@ -1,18 +0,0 @@
package com.jsl.oa.model.vodata;
import lombok.Data;
import java.util.List;
@Data
public class PermissionContentVo {
private Long id;
private String name;
private String code;
private Short type;
private List<PermissionContentVo> children;
}

View File

@ -1,19 +1,12 @@
package com.jsl.oa.services;
import com.jsl.oa.model.vodata.PermissionEditVO;
import com.jsl.oa.utils.BaseResponse;
import javax.servlet.http.HttpServletRequest;
public interface PermissionService {
BaseResponse permissionAdd(HttpServletRequest request, Long rid, Long pid);
BaseResponse permissionUser(HttpServletRequest request, Long uid);
BaseResponse permissionGet(HttpServletRequest request);
BaseResponse permissionEdit(PermissionEditVO permissionEditVo, HttpServletRequest request);
BaseResponse permissionDelete(HttpServletRequest request, Long pid);
}

View File

@ -1,6 +1,6 @@
package com.jsl.oa.services.impl;
import com.jsl.oa.annotations.NeedRoleGroup;
import com.jsl.oa.annotations.NeedPermission;
import com.jsl.oa.dao.InfoDAO;
import com.jsl.oa.dao.RoleDAO;
import com.jsl.oa.dao.UserDAO;
@ -41,7 +41,7 @@ public class InfoServiceImpl implements InfoService {
private final RoleDAO roleDAO;
@Override
@NeedRoleGroup("info.image.add")
@NeedPermission("info.image.add")
public BaseResponse addHeaderImage(HttpServletRequest request, @NotNull CarouselVO carouselVO) {
// 获取用户
Long userId = Processing.getAuthHeaderToUserId(request);
@ -74,7 +74,7 @@ public class InfoServiceImpl implements InfoService {
}
@Override
@NeedRoleGroup("info.image.edit")
@NeedPermission("info.image.edit")
public BaseResponse editHeaderImage(HttpServletRequest request, @NotNull CarouselVO carouselVO) {
// 获取用户
Long userId = Processing.getAuthHeaderToUserId(request);
@ -124,7 +124,7 @@ public class InfoServiceImpl implements InfoService {
}
@Override
@NeedRoleGroup("info.image.del")
@NeedPermission("info.image.del")
public BaseResponse delHeaderImage(HttpServletRequest request, Integer id) {
// 用户权限校验
if (!Processing.checkUserIsConsole(request, roleDAO)) {
@ -146,7 +146,7 @@ public class InfoServiceImpl implements InfoService {
}
@Override
@NeedRoleGroup("info.image.setting.edit")
@NeedPermission("info.image.setting.edit")
public BaseResponse editSettingHeaderImage(HttpServletRequest request, Boolean showType) {
// 用户权限校验
if (!Processing.checkUserIsConsole(request, roleDAO)) {

View File

@ -1,7 +1,7 @@
package com.jsl.oa.services.impl;
import com.jsl.oa.annotations.NeedRoleGroup;
import com.jsl.oa.annotations.NeedPermission;
import com.jsl.oa.dao.NewsDAO;
import com.jsl.oa.model.dodata.NewsDO;
import com.jsl.oa.model.vodata.NewsAddVO;
@ -35,7 +35,7 @@ public class NewsServiceImpl implements NewsService {
private final NewsDAO newsDAO;
@Override
@NeedRoleGroup("news.add")
@NeedPermission("news.add")
public BaseResponse newsAdd(NewsAddVO newsAddVO, @NotNull HttpServletRequest request) {
// 拷贝新闻数据到实体类
NewsDO newsDO = new NewsDO();

View File

@ -1,24 +1,22 @@
package com.jsl.oa.services.impl;
import com.jsl.oa.annotations.NeedRoleGroup;
import com.jsl.oa.dao.PermissionDAO;
import com.jsl.oa.dao.RoleDAO;
import com.jsl.oa.dao.UserDAO;
import com.jsl.oa.mapper.PermissionMapper;
import com.jsl.oa.model.dodata.PermissionDO;
import com.jsl.oa.model.dodata.RoleUserDO;
import com.jsl.oa.model.vodata.PermissionContentVo;
import com.jsl.oa.model.vodata.PermissionEditVO;
import com.jsl.oa.model.vodata.PermissionContentVO;
import com.jsl.oa.services.PermissionService;
import com.jsl.oa.utils.BaseResponse;
import com.jsl.oa.utils.ErrorCode;
import com.jsl.oa.utils.Processing;
import com.jsl.oa.utils.ResultUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
/**
@ -26,29 +24,20 @@ import java.util.List;
* <hr/>
* 用于权限服务层的实现类,实现权限的增删改查,以及用户权限的获取
*
* @since v1.0.0
* @version v1.1.0
* @author xiao_lfeng | xiangZr-hhh | 176yunxuan
* @version v1.1.0
* @since v1.0.0
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class PermissionServiceImpl implements PermissionService {
private final PermissionMapper permissionMapper;
private final RoleDAO roleDAO;
private final PermissionDAO permissionDAO;
private final UserDAO userDAO;
@Override
@NeedRoleGroup("permission.add")
public BaseResponse permissionAdd(HttpServletRequest request, Long rid, Long pid) {
permissionMapper.permissionAdd(rid, pid);
return ResultUtil.success();
}
@Override
@NeedRoleGroup("permission.user")
public BaseResponse permissionUser(HttpServletRequest request, Long uid) {
if (userDAO.isExistUser(uid)) {
// 此用户是否为管理员
@ -68,40 +57,11 @@ public class PermissionServiceImpl implements PermissionService {
@Override
@NeedRoleGroup("permission.get")
public BaseResponse permissionGet(HttpServletRequest request) {
//获取所有权限数据
List<PermissionDO> permissionDOList = permissionMapper.getAllPermission();
//将数据按父子类封装
List<PermissionContentVo> permissionContentVos = Processing.convertToVoList(permissionDOList);
return ResultUtil.success(permissionContentVos);
}
@Override
@NeedRoleGroup("permission.edit")
public BaseResponse permissionEdit(PermissionEditVO permissionEditVo, HttpServletRequest request) {
//根据id获取对应permission数据
PermissionDO permissionDO = permissionMapper.getPermissionById(permissionEditVo.getId());
if (permissionDO == null) {
return ResultUtil.error(ErrorCode.PERMISSION_NOT_EXIST);
}
//传递要编辑的数据
Processing.copyProperties(permissionEditVo, permissionDO);
//更新permission
if (!permissionMapper.updatePermission(permissionDO)) {
return ResultUtil.error(ErrorCode.DATABASE_UPDATE_ERROR);
}
return ResultUtil.success();
}
@Override
@NeedRoleGroup("permission.delete")
public BaseResponse permissionDelete(HttpServletRequest request, Long pid) {
//删除权限
if (!permissionMapper.deletePermission(pid)) {
return ResultUtil.error(ErrorCode.DATABASE_DELETE_ERROR);
}
return ResultUtil.success();
List<PermissionDO> permissionDOList = permissionDAO.getAllPermission();
List<PermissionContentVO> permissionContentVO = new ArrayList<>();
BeanUtils.copyProperties(permissionDOList, permissionContentVO);
return ResultUtil.success(permissionContentVO);
}
}

View File

@ -3,7 +3,7 @@ package com.jsl.oa.services.impl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jsl.oa.annotations.NeedRoleGroup;
import com.jsl.oa.annotations.NeedPermission;
import com.jsl.oa.dao.ProjectDAO;
import com.jsl.oa.dao.RoleDAO;
import com.jsl.oa.dao.UserDAO;
@ -232,7 +232,7 @@ public class ProjectServiceImpl implements ProjectService {
}
@Override
@NeedRoleGroup("info.project.add")
@NeedPermission("info.project.add")
public BaseResponse addHeader(HttpServletRequest request, ProjectShowVO projectShowVO) {
// 获取用户
Long userId = Processing.getAuthHeaderToUserId(request);
@ -258,7 +258,7 @@ public class ProjectServiceImpl implements ProjectService {
}
@Override
@NeedRoleGroup("info.project.del")
@NeedPermission("info.project.del")
public BaseResponse delHeader(Integer id, HttpServletRequest request) {
// 获取展示信息
ProjectShowDO projectShowDO = projectDAO.getHeader();
@ -276,7 +276,7 @@ public class ProjectServiceImpl implements ProjectService {
}
@Override
@NeedRoleGroup("info.project.edit")
@NeedPermission("info.project.edit")
public BaseResponse editHeader(HttpServletRequest request, ProjectShowVO projectShowVO, Integer id) {
// 获取用户
Long userId = Processing.getAuthHeaderToUserId(request);

View File

@ -1,6 +1,6 @@
package com.jsl.oa.services.impl;
import com.jsl.oa.annotations.NeedRoleGroup;
import com.jsl.oa.annotations.NeedPermission;
import com.jsl.oa.dao.RoleDAO;
import com.jsl.oa.dao.UserDAO;
import com.jsl.oa.exception.ClassCopyException;
@ -42,7 +42,7 @@ public class RoleServiceImpl implements RoleService {
private final UserDAO userDAO;
@Override
@NeedRoleGroup("role.add")
@NeedPermission("role.add")
public BaseResponse roleAddUser(HttpServletRequest request, Long uid, Long rid) {
if (Processing.checkUserIsConsole(request, roleDAO)) {
roleDAO.addRoleUser(uid, rid);

View File

@ -1,11 +1,11 @@
package com.jsl.oa.services.impl;
import com.google.gson.Gson;
import com.jsl.oa.annotations.NeedPermission;
import com.jsl.oa.annotations.UserAbleToUse;
import com.jsl.oa.dao.PermissionDAO;
import com.jsl.oa.dao.RoleDAO;
import com.jsl.oa.dao.UserDAO;
import com.jsl.oa.model.dodata.RoleDO;
import com.jsl.oa.model.dodata.RoleUserDO;
import com.jsl.oa.model.dodata.UserDO;
import com.jsl.oa.model.vodata.*;
import com.jsl.oa.services.UserService;
@ -21,8 +21,6 @@ import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.regex.Pattern;
/**
@ -43,6 +41,7 @@ public class UserServiceImpl implements UserService {
private final UserDAO userDAO;
private final RoleDAO roleDAO;
private final PermissionDAO permissionDAO;
private final Gson gson;
@Override
public UserDO getUserInfoByUsername(String username) {
@ -125,46 +124,23 @@ public class UserServiceImpl implements UserService {
return ResultUtil.success(userCurrentBackVO);
}
@SuppressWarnings("checkstyle:NestedIfDepth")
@Override
@UserAbleToUse
public BaseResponse userCurrent(HttpServletRequest request,
String id,
String username,
String email,
String phone) {
@NeedPermission("user:current")
public BaseResponse userCurrent(
HttpServletRequest request,
String id,
String username,
String email,
String phone
) {
UserDO userDO;
if (id == null && username == null && email == null && phone == null) {
// Token获取信息
UserDO userDO = userDAO.getUserById(Processing.getAuthHeaderToUserId(request));
if (userDO != null) {
return ResultUtil.success(Processing.returnUserInfo(userDO, roleDAO, permissionDAO));
} else {
return ResultUtil.error(ErrorCode.USER_NOT_EXIST);
}
userDO = userDAO.getUserById(Processing.getAuthHeaderToUserId(request));
} else {
// 检查是否是管理员用户
Long userId = Processing.getAuthHeaderToUserId(request);
if (userId != null) {
List<String> getPermission = permissionDAO.getPermission(userId);
// 匹配权限
if (!getPermission.contains("user.current")) {
log.info("\t> 用户权限不足,检查是否是管理员");
// 检查用户是管理员
RoleUserDO roleUserDO = roleDAO
.getRoleUserByUid(Objects.requireNonNull(Processing.getAuthHeaderToUserId(request)));
if (roleUserDO == null) {
return ResultUtil.error(ErrorCode.NOT_PERMISSION);
}
RoleDO roleDO = roleDAO.getRoleByRoleName("console");
if (!roleUserDO.getRid().equals(roleDO.getId())) {
return ResultUtil.error(ErrorCode.NOT_PERMISSION);
}
}
} else {
return ResultUtil.error(ErrorCode.TOKEN_NOT_EXIST);
}
// 根据顺序优先级进行用户信息获取
UserDO userDO = null;
userDO = null;
if (id != null && !id.isEmpty()) {
userDO = userDAO.getUserById(Long.valueOf(id));
} else if (username != null && !username.isEmpty()) {
@ -174,12 +150,12 @@ public class UserServiceImpl implements UserService {
} else if (phone != null && !phone.isEmpty()) {
userDO = userDAO.getUserByPhone(phone);
}
// 返回结果
if (userDO != null) {
return ResultUtil.success(Processing.returnUserInfo(userDO, roleDAO, permissionDAO));
} else {
return ResultUtil.error(ErrorCode.USER_NOT_EXIST);
}
}
// 返回结果
if (userDO != null) {
return ResultUtil.success(Processing.returnUserInfo(userDO, roleDAO, gson));
} else {
return ResultUtil.error(ErrorCode.USER_NOT_EXIST);
}
}

View File

@ -3,24 +3,30 @@ package com.jsl.oa.utils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jsl.oa.dao.PermissionDAO;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.jsl.oa.dao.RoleDAO;
import com.jsl.oa.dao.UserDAO;
import com.jsl.oa.exception.ClassCopyException;
import com.jsl.oa.model.dodata.*;
import com.jsl.oa.model.vodata.PermissionContentVo;
import com.jsl.oa.model.dodata.ProjectDO;
import com.jsl.oa.model.dodata.RoleDO;
import com.jsl.oa.model.dodata.RoleUserDO;
import com.jsl.oa.model.dodata.UserDO;
import com.jsl.oa.model.vodata.ProjectSimpleVO;
import com.jsl.oa.model.vodata.UserCurrentBackVO;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.springframework.beans.BeanUtils;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Field;
import java.sql.Timestamp;
import java.util.*;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Random;
/**
* <h1>自定义快捷工具类</h1>
@ -164,7 +170,7 @@ public class Processing {
* <hr/>
* 该方法用于检查用户是否是管理员类型封装后字节返回结果
*
* @param request 请求
* @param request 请求
* @return 如果为 true 是管理员false 不是管理员
*/
public static @NotNull Boolean checkUserIsConsole(HttpServletRequest request, @NotNull RoleDAO roleDAO) {
@ -180,7 +186,7 @@ public class Processing {
/**
* 检查用户是否是老师
*
* @param request 请求
* @param request 请求
* @return 如果为 true 是老师false 不是老师
*/
public static @NotNull Boolean checkUserIsPrincipal(HttpServletRequest request, @NotNull RoleDAO roleDAO) {
@ -263,9 +269,12 @@ public class Processing {
@Contract(pure = true)
public static @NotNull String getSex(short sex) {
switch (sex) {
case 1: return "";
case 2: return "";
default: return "保密";
case 1:
return "";
case 2:
return "";
default:
return "保密";
}
}
@ -278,56 +287,23 @@ public class Processing {
* @return {@link BaseResponse}
*/
public static @NotNull UserCurrentBackVO.UserCurrent returnUserInfo(
@NotNull UserDO userDO, RoleDAO roleDAO, PermissionDAO permissionDAO) {
@NotNull UserDO userDO, RoleDAO roleDAO, Gson gson) {
UserCurrentBackVO.UserCurrent userCurrent = new UserCurrentBackVO.UserCurrent();
// 获取用户角色
RoleUserDO getUserRole = roleDAO.getRoleUserByUid(userDO.getId());
if (getUserRole == null) {
getUserRole = new RoleUserDO();
getUserRole.setRid(0L).setCreatedAt(new Timestamp(System.currentTimeMillis()));
} else {
getUserRole.setUid(null);
}
// 获取用户权限
RoleUserDO roleUserDO = roleDAO.getRoleUserByUid(userDO.getId());
RoleDO getRole = roleDAO.getRoleByUserId(userDO.getId());
List<String> getPermissionForString;
if (roleUserDO != null) {
// 获取全部根权限
getPermissionForString = permissionDAO.getAllPermissionBuildString();
} else {
// 获取权限列表信息
getPermissionForString = permissionDAO.getPermission(userDO.getId());
}
RoleDO getRole = roleDAO.getRoleById(getUserRole.getRid());
String getRoleString;
if (getRole != null) {
getRoleString = getRole.getRoleName();
// 获取全部根权限
getPermissionForString = gson.fromJson(getRole.getPermissions(), new TypeToken<List<String>>() {
}.getType());
} else {
getRoleString = "default";
getPermissionForString = null;
}
UserCurrentBackVO.ReturnUser returnUser = new UserCurrentBackVO.ReturnUser();
BeanUtils.copyProperties(userDO, returnUser);
userCurrent
.setUser(new UserCurrentBackVO.ReturnUser()
.setId(userDO.getId())
.setJobId(userDO.getJobId())
.setUsername(userDO.getUsername())
.setAddress(userDO.getAddress())
.setPhone(userDO.getPhone())
.setEmail(userDO.getEmail())
.setAge(userDO.getAge())
.setSignature(userDO.getSignature())
.setAvatar(userDO.getAvatar())
.setNickname(userDO.getNickname())
.setSex(userDO.getSex())
.setEnabled(userDO.getEnabled())
.setAccountNoExpired(userDO.getAccountNoExpired())
.setCredentialsNoExpired(userDO.getCredentialsNoExpired())
.setRecommend(userDO.getRecommend())
.setAccountNoLocked(userDO.getAccountNoLocked())
.setDescription(userDO.getDescription())
.setCreatedAt(userDO.getCreatedAt())
.setUpdatedAt(userDO.getUpdatedAt())
.setIsDelete(userDO.getIsDelete()))
.setRole(getRoleString)
.setUser(returnUser)
.setRole(getRole != null ? getRole.getRoleName() : "default")
.setPermission(getPermissionForString);
return userCurrent;
}
@ -384,56 +360,6 @@ public class Processing {
//return ProjectSimpleVO;
}
/**
* @Description: 将Permission归纳为父子关系的json形式
* @Date: 2024/1/20
* @Param permissions: 权限实体类
**/
public static List<PermissionContentVo> convertToVoList(List<PermissionDO> permissions) {
List<PermissionContentVo> vos = new ArrayList<>();
Map<Long, List<PermissionDO>> childrenMap = new HashMap<>();
for (PermissionDO permission : permissions) {
if (permission.getPid() != null) {
List<PermissionDO> children = childrenMap.getOrDefault(permission.getPid(), new ArrayList<>());
children.add(permission);
childrenMap.put(permission.getPid(), children);
}
}
for (PermissionDO permission : permissions) {
if (permission.getPid() == null) {
PermissionContentVo vo = convertToVo(permission, childrenMap);
vos.add(vo);
}
}
return vos;
}
/**
* @Description: 封装PermissionContentVo的子类被convertToVoList方法调用
* @Date: 2024/1/20
* @Param permission: 权限实体类
* @Param childrenMap: 要封装的子类
**/
public static PermissionContentVo convertToVo(PermissionDO permission, Map<Long, List<PermissionDO>> childrenMap) {
PermissionContentVo vo = new PermissionContentVo();
copyProperties(permission, vo);
List<PermissionDO> children = childrenMap.get(permission.getId());
if (children != null) {
List<PermissionContentVo> childVos = new ArrayList<>();
for (PermissionDO child : children) {
PermissionContentVo childVo = convertToVo(child, childrenMap);
childVos.add(childVo);
}
vo.setChildren(childVos);
}
return vo;
}
/**
* @Description: 转换审核的类别属性为字符串
@ -443,11 +369,11 @@ public class Processing {
public static String turnReviewCategory(short category) {
switch (category) {
case 0:
return "子系统";
return "子系统";
case 1:
return "模块";
return "模块";
default:
return "其他";
return "其他";
}
}
@ -465,7 +391,4 @@ public class Processing {
}
}

View File

@ -1,14 +1,11 @@
create table oa_permissions
(
id bigint unsigned auto_increment comment '主键'
id bigint unsigned auto_increment comment '主键'
primary key,
pid bigint unsigned null comment '权限父id',
name varchar(100) not null comment '权限名称',
code varchar(50) not null comment '权限编码',
type tinyint(1) default 1 not null comment '0为菜单1为权限',
deleted_at timestamp null comment '删除时间(没有删除应当为空)',
constraint oa_permissions_oa_permissions_id_fk
foreign key (pid) references oa_permissions (id)
on update cascade on delete cascade
name varchar(100) not null comment '权限名称',
description varchar(100) not null comment '权限描述',
created_at timestamp default CURRENT_TIMESTAMP not null comment '创建时间',
constraint oa_permissions_name_uindex
unique (name)
)
comment '权限表';

View File

@ -4,6 +4,7 @@ create table oa_role
primary key,
role_name varchar(20) not null comment '角色名称',
display_name varchar(10) null comment '中文描述',
permissions json null comment '用户组权限',
created_at timestamp default CURRENT_TIMESTAMP not null comment '创建时间',
updated_at timestamp null comment '修改时间'
)