feat: 权限控制

This commit is contained in:
筱锋xiao_lfeng 2024-01-22 18:20:32 +08:00
parent cc11295dc1
commit 9f82efd772
No known key found for this signature in database
GPG Key ID: F693AA12AABBFA87
6 changed files with 138 additions and 31 deletions

View File

@ -67,11 +67,11 @@ public class AuthControllerAspect {
* @throws Throwable 异常 * @throws Throwable 异常
*/ */
@Around("execution(* com.jsl.oa.controllers.*.*(..)) " + @Around("execution(* com.jsl.oa.controllers.*.*(..)) " +
"|| !execution(* com.jsl.oa.controllers.AuthController.authSendEmailCode(..))" + "&& !execution(* com.jsl.oa.controllers.AuthController.authSendEmailCode(..))" +
"|| !execution(* com.jsl.oa.controllers.AuthController.authLoginByEmail(..))" + "&& !execution(* com.jsl.oa.controllers.AuthController.authLoginByEmail(..))" +
"|| !execution(* com.jsl.oa.controllers.AuthController.authForgetPassword(..))" + "&& !execution(* com.jsl.oa.controllers.AuthController.authForgetPassword(..))" +
"|| !execution(* com.jsl.oa.controllers.AuthController.authLogin(..))" + "&& !execution(* com.jsl.oa.controllers.AuthController.authLogin(..))" +
"|| !execution(* com.jsl.oa.controllers.AuthController.authRegister(..))") "&& !execution(* com.jsl.oa.controllers.AuthController.authRegister(..))")
public Object tokenControllerAround(ProceedingJoinPoint pjp) throws Throwable { public Object tokenControllerAround(ProceedingJoinPoint pjp) throws Throwable {
// 获取 HttpServletRequest 对象 // 获取 HttpServletRequest 对象
HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();

View File

@ -38,7 +38,9 @@ public class PermissionController {
// 判断是否有参数错误 // 判断是否有参数错误
if (uid == null ) { if (uid == null ) {
return ResultUtil.error(ErrorCode.PARAMETER_ERROR); return ResultUtil.error(ErrorCode.PARAMETER_ERROR);
} else return permissionService.permissionUser(request,uid); } else {
return permissionService.permissionUser(request,uid);
}
} }
@GetMapping("/permission/get") @GetMapping("/permission/get")

View File

@ -0,0 +1,88 @@
package com.jsl.oa.dao;
import com.jsl.oa.mapper.PermissionMapper;
import com.jsl.oa.model.doData.PermissionDO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* <h1>权限数据表</h1>
* <hr/>
* 内容进入自定义实体类
*
* @author xiao_lfeng
* @version v1.1.0
* @since v1.1.0
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class PermissionDAO {
private final PermissionMapper permissionMapper;
public List<String> getPermission(Long uid) {
log.info("\t> 执行 DAO 层 PermissionDAO.getPermission 方法");
List<PermissionDO> permissionList = permissionMapper.permissionUserPid(uid);
List<String> getPermissionForString = new ArrayList<>();
for (PermissionDO permission : permissionList) {
// 寻找是否存在父亲
StringBuilder permissionString = new StringBuilder();
if (permission.getPid() != null) {
// 存在父亲
this.getFatherPermission(permissionString, permission.getPid());
// 寻找子类
this.getChildPermission(permissionString, permission.getId(), getPermissionForString);
getPermissionForString.add(permissionString.toString());
} else {
// 不存在父亲
permissionString.append(permission.getName());
this.getChildPermission(permissionString, permission.getId(), getPermissionForString);
getPermissionForString.add(permissionString.toString());
}
}
// 存入 Redis
return 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;
}
}
}
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());
}
}
}

View File

@ -12,6 +12,7 @@ import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MissingServletRequestParameterException; import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import java.util.Objects; import java.util.Objects;
import java.util.regex.Matcher; import java.util.regex.Matcher;
@ -66,4 +67,10 @@ public class ProcessException {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
return ResultUtil.error("ServerInternalError", 50001, "服务器内部错误"); return ResultUtil.error("ServerInternalError", 50001, "服务器内部错误");
} }
@ExceptionHandler(value = MethodArgumentTypeMismatchException.class)
public ResponseEntity<BaseResponse> businessMethodArgumentTypeMismatchException(@NotNull MethodArgumentTypeMismatchException e) {
log.error(e.getMessage(), e);
return ResultUtil.error("ServerInternalError", 50002, "服务器内部错误");
}
} }

View File

@ -9,16 +9,16 @@ import java.util.List;
@Mapper @Mapper
public interface PermissionMapper { public interface PermissionMapper {
@Insert("insert into organize_oa.oa_role_permissions(rid, pid) VALUE (#{rid},#{pid})") @Insert("INSERT INTO organize_oa.oa_role_permissions(rid, pid) VALUE (#{rid},#{pid})")
void permissionAdd(Long rid, Long pid); void permissionAdd(Long rid, Long pid);
@Select("select name from organize_oa.oa_permissions where id in(select pid " + @Select("SELECT * FROM organize_oa.oa_permissions WHERE id IN " +
"from organize_oa.oa_role_permissions where rid=" + "(SELECT pid FROM organize_oa.oa_role_permissions WHERE rid IN " +
"(select rid from organize_oa.oa_role_user where uid=#{uid}) )") "(SELECT rid FROM organize_oa.oa_role_user WHERE uid = #{uid}))")
List<String> permissionUser(Long uid); List<PermissionDO> permissionUserPid(Long uid);
@Select("SELECT * FROM organize_oa.oa_permissions where id=#{id}") @Select("SELECT * FROM organize_oa.oa_permissions where id=#{id}")
PermissionDO permissionGetById(Long id); PermissionDO getPermissionById(Long id);
@Select("SELECT * FROM organize_oa.oa_role_permissions where pid=#{pid}") @Select("SELECT * FROM organize_oa.oa_role_permissions where pid=#{pid}")
RolePermissionDO rolePermissionGetByPid(Long pid); RolePermissionDO rolePermissionGetByPid(Long pid);
@ -32,4 +32,13 @@ public interface PermissionMapper {
@Delete("DELETE FROM organize_oa.oa_permissions where id=#{pid}") @Delete("DELETE FROM organize_oa.oa_permissions where id=#{pid}")
boolean deletePermission(Long 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);
} }

View File

@ -1,5 +1,6 @@
package com.jsl.oa.services.impl; package com.jsl.oa.services.impl;
import com.jsl.oa.dao.PermissionDAO;
import com.jsl.oa.dao.UserDAO; import com.jsl.oa.dao.UserDAO;
import com.jsl.oa.mapper.PermissionMapper; import com.jsl.oa.mapper.PermissionMapper;
import com.jsl.oa.mapper.RoleMapper; import com.jsl.oa.mapper.RoleMapper;
@ -25,6 +26,7 @@ public class PermissionServiceImpl implements PermissionService {
private final PermissionMapper permissionMapper; private final PermissionMapper permissionMapper;
private final RoleMapper roleMapper; private final RoleMapper roleMapper;
private final PermissionDAO permissionDAO;
private final UserDAO userDAO; private final UserDAO userDAO;
@Override @Override
@ -39,10 +41,11 @@ public class PermissionServiceImpl implements PermissionService {
@Override @Override
public BaseResponse permissionUser(HttpServletRequest request, Long uid) { public BaseResponse permissionUser(HttpServletRequest request, Long uid) {
log.info("\t> 执行 Service 层 PermissionService.permissionUser 方法"); log.info("\t> 执行 Service 层 PermissionService.permissionUserPid 方法");
if (userDAO.isExistUser(uid)) { if (userDAO.isExistUser(uid)) {
List<String> permission = permissionMapper.permissionUser(uid); // 获取权限列表信息
return ResultUtil.success(permission); List<String> getPermissionForString = permissionDAO.getPermission(uid);
return ResultUtil.success(getPermissionForString);
} }
return ResultUtil.error(ErrorCode.USER_NOT_EXIST); return ResultUtil.error(ErrorCode.USER_NOT_EXIST);
} }
@ -56,9 +59,9 @@ public class PermissionServiceImpl implements PermissionService {
return ResultUtil.error(ErrorCode.NOT_ADMIN); return ResultUtil.error(ErrorCode.NOT_ADMIN);
} }
//获取所有权限数据 //获取所有权限数据
List<PermissionDO> permissionDOS = permissionMapper.getAllPermission(); List<PermissionDO> permissionDOList = permissionMapper.getAllPermission();
//将数据按父子类封装 //将数据按父子类封装
List<PermissionContentVo> permissionContentVos = Processing.convertToVoList(permissionDOS); List<PermissionContentVo> permissionContentVos = Processing.convertToVoList(permissionDOList);
return ResultUtil.success(permissionContentVos); return ResultUtil.success(permissionContentVos);
} }
@ -71,7 +74,7 @@ public class PermissionServiceImpl implements PermissionService {
return ResultUtil.error(ErrorCode.NOT_ADMIN); return ResultUtil.error(ErrorCode.NOT_ADMIN);
} }
//根据id获取对应permission数据 //根据id获取对应permission数据
PermissionDO permissionDO = permissionMapper.permissionGetById(permissionEditVo.getId()); PermissionDO permissionDO = permissionMapper.getPermissionById(permissionEditVo.getId());
if (permissionDO == null) { if (permissionDO == null) {
return ResultUtil.error(ErrorCode.PERMISSION_NOT_EXIST); return ResultUtil.error(ErrorCode.PERMISSION_NOT_EXIST);
} }
@ -86,6 +89,7 @@ public class PermissionServiceImpl implements PermissionService {
@Override @Override
public BaseResponse permissionDelete(HttpServletRequest request, Long pid) { public BaseResponse permissionDelete(HttpServletRequest request, Long pid) {
log.info("\t> 执行 Service 层 PermissionService.permissionDelete 方法");
//检验用户权限是否为管理员 //检验用户权限是否为管理员
if (!Processing.checkUserIsAdmin(request, roleMapper)) { if (!Processing.checkUserIsAdmin(request, roleMapper)) {
return ResultUtil.error(ErrorCode.NOT_ADMIN); return ResultUtil.error(ErrorCode.NOT_ADMIN);
@ -94,9 +98,6 @@ public class PermissionServiceImpl implements PermissionService {
if (!permissionMapper.deletePermission(pid)) { if (!permissionMapper.deletePermission(pid)) {
return ResultUtil.error(ErrorCode.DATABASE_DELETE_ERROR); return ResultUtil.error(ErrorCode.DATABASE_DELETE_ERROR);
} }
return ResultUtil.success(); return ResultUtil.success();
} }
} }