diff --git a/src/main/java/com/jsl/oa/annotations/CheckUserAbleToUse.java b/src/main/java/com/jsl/oa/annotations/CheckUserAbleToUse.java new file mode 100644 index 0000000..508fc24 --- /dev/null +++ b/src/main/java/com/jsl/oa/annotations/CheckUserAbleToUse.java @@ -0,0 +1,60 @@ +package com.jsl.oa.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + *

检查用户是否可用

+ *
+ * 用于检查用户是否可用 + * + * @version v1.1.0 + * @since v1.1.0 + * @see com.jsl.oa.aspect.AnnotationsAspect + * @author xiao_lfeng + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface CheckUserAbleToUse { + /** + *

是否启用

+ *
+ * 用于指定是否启用
+ * 请注意,禁用后任何用户权限校验不校验用户是否启用 + * + * @return {@link Boolean} + */ + boolean isCheckEnable() default true; + + /** + *

是否删除

+ *
+ * 用于指定是否删除
+ * 请注意,禁用后任何用户权限校验不校验用户是否删除 + * + * @return {@link Boolean} + */ + boolean isCheckDelete() default true; + + /** + *

是否锁定

+ *
+ * 用于指定是否锁定
+ * 请注意,禁用后任何用户权限校验不校验用户是否锁定 + * + * @return {@link Boolean} + */ + boolean isCheckLock() default true; + + /** + *

是否过期

+ *
+ * 用于指定是否过期
+ * 请注意,禁用后任何用户权限校验不校验用户是否过期 + * + * @return {@link Boolean} + */ + boolean isCheckExpire() default true; +} diff --git a/src/main/java/com/jsl/oa/annotations/CheckUserHasPermission.java b/src/main/java/com/jsl/oa/annotations/CheckUserHasPermission.java new file mode 100644 index 0000000..824f40e --- /dev/null +++ b/src/main/java/com/jsl/oa/annotations/CheckUserHasPermission.java @@ -0,0 +1,36 @@ +package com.jsl.oa.annotations; + +import java.lang.annotation.*; + +/** + *

检查用户是否有权限

+ *
+ * 用于检查用户是否有权限 + * + * @version v1.1.0 + * @since v1.1.0 + * @author xiao_lfeng + */ +@Documented +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface CheckUserHasPermission { + /** + *

权限名称

+ *
+ * 用于指定权限名称 + * + * @return {@link String} + */ + String value() default ""; + + /** + *

是否检查

+ *
+ * 用于指定是否检查
+ * 请注意,该方法只会禁止检查权限,但是不会禁止检查用户是否允许继续执行 + * @since v1.1.0 + * @return {@link Boolean} + */ + boolean isCheck() default true; +} diff --git a/src/main/java/com/jsl/oa/aspect/AnnotationsAspect.java b/src/main/java/com/jsl/oa/aspect/AnnotationsAspect.java new file mode 100644 index 0000000..faadbc5 --- /dev/null +++ b/src/main/java/com/jsl/oa/aspect/AnnotationsAspect.java @@ -0,0 +1,203 @@ +package com.jsl.oa.aspect; + +import com.jsl.oa.annotations.CheckUserAbleToUse; +import com.jsl.oa.annotations.CheckUserHasPermission; +import com.jsl.oa.dao.PermissionDAO; +import com.jsl.oa.dao.RoleDAO; +import com.jsl.oa.dao.UserDAO; +import com.jsl.oa.mapper.UserMapper; +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.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.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; +import java.util.List; +import java.util.Objects; + +/** + *

注解切面

+ *
+ * 用于注解的切面 + * + * @author xiao_lfeng + * @version v1.1.0 + * @since v1.1.0 + */ +@Slf4j +@Aspect +@Component +@RequiredArgsConstructor +public class AnnotationsAspect { + private final RoleDAO roleDAO; + private final UserDAO userDAO; + private final PermissionDAO permissionDAO; + + /** + *

检查用户是否有权限

+ *
+ * 检查用户是否有权限 + * + * @param pjp ProceedingJoinPoint对象 + * @return {@link Object} + * @throws Throwable 异常 + */ + @Around("@annotation(com.jsl.oa.annotations.CheckUserHasPermission)") + public Object checkUserHasPermission(@NotNull ProceedingJoinPoint pjp) throws Throwable { + log.info("用户权限检查"); + // 获取 HttpServletRequest 对象 + HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); + + // 获取注解方法 + CheckUserHasPermission checkUserHasPermission = getCheckUserHasPermission(pjp); + // 获取注解值 + String permissionName = null; + boolean permissionCheck = true; + if (checkUserHasPermission != null) { + permissionName = checkUserHasPermission.value(); + permissionCheck = checkUserHasPermission.isCheck(); + } + + // 获取用户信息 + Long userId = Processing.getAuthHeaderToUserId(request); + if (userId != null) { + // 检查用户是否允许继续执行 + BaseResponse checkUserAbleToNext = checkUserAbleToNext(userId, userDAO.userMapper); + if (checkUserAbleToNext != null) { + return checkUserAbleToNext; + } else { + if (permissionCheck) { + // 检查用户权限 + List getPermission = permissionDAO.getPermission(userId); + // 匹配权限 + if (getPermission.contains(permissionName)) { + return pjp.proceed(); + } else { + log.info("\t> 用户权限不足,检查是否是管理员"); + // 检查用户是管理员 + RoleUserDO roleUserDO = roleDAO.roleMapper.getRoleUserByUid(Processing.getAuthHeaderToUserId(request)); + if (roleUserDO != null) { + RoleDO roleDO = roleDAO.roleMapper.getRoleByRoleName("admin"); + if (roleUserDO.getRid().equals(roleDO.getId())) { + return pjp.proceed(); + } else { + return ResultUtil.error(ErrorCode.NOT_PERMISSION); + } + } else { + return ResultUtil.error(ErrorCode.NOT_ADMIN); + } + } + } else { + return pjp.proceed(); + } + } + } else { + return ResultUtil.error(ErrorCode.TOKEN_NOT_EXIST); + } + } + + @Around("@annotation(com.jsl.oa.annotations.CheckUserAbleToUse)") + public Object checkUserAbleToUse(ProceedingJoinPoint pjp) throws Throwable { + log.info("检查用户是否有权限继续"); + // 获取 HttpServletRequest 对象 + HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); + + // 获取注解方法 + CheckUserAbleToUse check = getCheckUserAbleToUse(pjp); + // 获取注解值 + assert check != null; + + // 获取用户信息 + Long userId = Processing.getAuthHeaderToUserId(request); + UserDO userDO = userDAO.userMapper.getUserById(userId); + // 用户不存在 + if (userDO == null) { + return ResultUtil.error(ErrorCode.USER_NOT_EXIST); + } + if (check.isCheckEnable()) { + // 用户是否被禁用 + if (!userDO.getEnabled()) { + return ResultUtil.error(ErrorCode.USER_DISABLED); + } + } + if (check.isCheckLock()) { + // 用户是否被封禁 + if (!userDO.getAccountNoLocked()) { + return ResultUtil.error(ErrorCode.USER_LOCKED); + } + } + if (check.isCheckDelete()) { + // 用户是否被删除 + if (userDO.getIsDelete()) { + return ResultUtil.error(ErrorCode.USER_ALREADY_DELETE); + } + } + if (check.isCheckExpire()) { + // 用户是否过期 + if (!userDO.getAccountNoExpired()) { + return ResultUtil.error(ErrorCode.USER_EXPIRED); + } + } + return pjp.proceed(); + } + + private @Nullable CheckUserHasPermission getCheckUserHasPermission(@NotNull ProceedingJoinPoint joinPoint) { + // 获取方法对象 + MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); + Method method = methodSignature.getMethod(); + + // 获取方法上的注解 + return (method != null) ? method.getAnnotation(CheckUserHasPermission.class) : null; + } + + private @Nullable CheckUserAbleToUse getCheckUserAbleToUse(@NotNull ProceedingJoinPoint joinPoint) { + // 获取方法对象 + MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); + Method method = methodSignature.getMethod(); + + // 获取方法上的注解 + return (method != null) ? method.getAnnotation(CheckUserAbleToUse.class) : null; + } + + private @Nullable BaseResponse checkUserAbleToNext(Long userId, @NotNull UserMapper userMapper) { + log.info("\t> 检查用户是否有权限继续"); + // 获取用户信息 + UserDO userDO = userMapper.getUserById(userId); + // 用户不存在 + if (userDO == null) { + return ResultUtil.error(ErrorCode.USER_NOT_EXIST); + } + // 用户是否被禁用 + if (!userDO.getEnabled()) { + return ResultUtil.error(ErrorCode.USER_DISABLED); + } + // 用户是否被封禁 + if (!userDO.getAccountNoLocked()) { + return ResultUtil.error(ErrorCode.USER_LOCKED); + } + // 用户是否被删除 + if (userDO.getIsDelete()) { + return ResultUtil.error(ErrorCode.USER_ALREADY_DELETE); + } + // 用户是否过期 + if (!userDO.getAccountNoExpired()) { + return ResultUtil.error(ErrorCode.USER_EXPIRED); + } + return null; + } +} diff --git a/src/main/java/com/jsl/oa/aspect/AuthControllerAspect.java b/src/main/java/com/jsl/oa/aspect/AuthControllerAspect.java index ca301eb..923d863 100755 --- a/src/main/java/com/jsl/oa/aspect/AuthControllerAspect.java +++ b/src/main/java/com/jsl/oa/aspect/AuthControllerAspect.java @@ -102,6 +102,7 @@ public class AuthControllerAspect { private @NotNull Boolean checkTimestamp(@NotNull HttpServletRequest request) { // 获取请求头中的时间戳 String getTimestamp = request.getHeader("Timestamp"); + log.info("\t> 获取到的时间戳为 {} | 当前时间戳 {}", getTimestamp, System.currentTimeMillis()); // 判断是否为空 if (getTimestamp == null || getTimestamp.isEmpty()) { return false; diff --git a/src/main/java/com/jsl/oa/config/filter/CorsFilter.java b/src/main/java/com/jsl/oa/config/filter/CorsFilter.java index 8e94664..4839883 100644 --- a/src/main/java/com/jsl/oa/config/filter/CorsFilter.java +++ b/src/main/java/com/jsl/oa/config/filter/CorsFilter.java @@ -8,10 +8,21 @@ import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +/** + *

CORS过滤器

+ *
+ * 用于处理跨域请求 + * + * @version v1.1.0 + * @since v1.1.0 + * @see Filter + * @author xiao_lfeng + */ @Slf4j @Component public class CorsFilter implements Filter { - public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) { + @Override + public void doFilter(@NotNull ServletRequest req, ServletResponse res, FilterChain chain) { // 请求头处理 HttpServletResponse response = (HttpServletResponse) res; HttpServletRequest request = (HttpServletRequest) req; @@ -25,9 +36,11 @@ public class CorsFilter implements Filter { } } + @Override public void init(FilterConfig filterConfig) { } + @Override public void destroy() { Filter.super.destroy(); } diff --git a/src/main/java/com/jsl/oa/controllers/RoleController.java b/src/main/java/com/jsl/oa/controllers/RoleController.java index 514de4a..b7c272e 100755 --- a/src/main/java/com/jsl/oa/controllers/RoleController.java +++ b/src/main/java/com/jsl/oa/controllers/RoleController.java @@ -11,14 +11,11 @@ import com.jsl.oa.utils.ResultUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; -import java.util.ArrayList; -import java.util.regex.Pattern; /** *

角色控制器

@@ -44,7 +41,7 @@ public class RoleController { * @return {@link BaseResponse} */ @GetMapping("/role/get") - public BaseResponse roleGet(HttpServletRequest request, @RequestParam @Nullable String id) { + public BaseResponse roleGet(HttpServletRequest request, @RequestParam(required = false) String id) { log.info("请求接口[GET]: /role/get"); return roleService.roleGet(request, id); } @@ -79,17 +76,11 @@ public class RoleController { * @return {@link BaseResponse} */ @DeleteMapping("/role/delete") - public BaseResponse roleDelete(HttpServletRequest request, @RequestParam String id) { + public BaseResponse roleDelete(HttpServletRequest request, @RequestParam Long id) { log.info("请求接口[DELETE]: /role/delete"); // 判断是否有参数错误 if (id == null) { return ResultUtil.error(ErrorCode.PARAMETER_ERROR); - } else { - if (Pattern.matches("^[0-9]+$", id)) { - ArrayList error = new ArrayList<>(); - error.add("id 只能为数字"); - return ResultUtil.error(ErrorCode.PARAMETER_ERROR, error); - } } return roleService.roleDelete(request, Long.valueOf(id)); } diff --git a/src/main/java/com/jsl/oa/dao/PermissionDAO.java b/src/main/java/com/jsl/oa/dao/PermissionDAO.java index 7424a15..fc4a9e5 100644 --- a/src/main/java/com/jsl/oa/dao/PermissionDAO.java +++ b/src/main/java/com/jsl/oa/dao/PermissionDAO.java @@ -53,15 +53,13 @@ public class PermissionDAO { 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()); } + // 寻找子类 + this.getChildPermission(permissionString, permission.getId(), getPermissionForString); + getPermissionForString.add(permissionString.toString()); } // 存入 Redis permissionRedisUtil.setData(BusinessConstants.NONE, uid.toString(), gson.toJson(getPermissionForString), 1440); diff --git a/src/main/java/com/jsl/oa/exception/ProcessException.java b/src/main/java/com/jsl/oa/exception/ProcessException.java index a0d60c3..bc7b85b 100755 --- a/src/main/java/com/jsl/oa/exception/ProcessException.java +++ b/src/main/java/com/jsl/oa/exception/ProcessException.java @@ -14,10 +14,22 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; -import java.util.Objects; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - +/** + *

异常处理

+ *
+ * 用于处理异常 + * + * @version v1.1.0 + * @since v1.1.0 + * @see HttpRequestMethodNotSupportedException + * @see DuplicateKeyException + * @see HttpMessageNotReadableException + * @see MissingServletRequestParameterException + * @see Exception + * @see ClassCopyException + * @see MethodArgumentTypeMismatchException + * @author xiao_lfeng + */ @Slf4j @RestControllerAdvice public class ProcessException { @@ -42,32 +54,47 @@ public class ProcessException { @ExceptionHandler(value = MissingServletRequestParameterException.class) public ResponseEntity businessMissingServletRequestParameterException(MissingServletRequestParameterException e) { log.error(e.getMessage(), e); - // 使用正则表达式匹配并提取'id'部分 - Pattern pattern = Pattern.compile("'.*?'"); - Matcher matcher = pattern.matcher(Objects.requireNonNull(e.getMessage())); - - // 查找匹配项 - while (matcher.find()) { - String matchedGroup = matcher.group(); - } - return ResponseEntity .status(400) .body(ResultUtil.error(ErrorCode.PARAMETER_ERROR, "缺少 " + e.getParameterName() + " 参数")); } + /** + *

业务异常

+ *
+ * 用于处理业务异常 + * + * @param e 异常 + * @return {@link ResponseEntity} + */ @ExceptionHandler(value = Exception.class) public ResponseEntity businessException(@NotNull Exception e) { log.error(e.getMessage(), e); return ResultUtil.error("ServerInternalError", 50000, "服务器内部错误"); } + /** + *

类拷贝异常

+ *
+ * 用于处理类拷贝异常 + * + * @param e 异常 + * @return {@link ResponseEntity} + */ @ExceptionHandler(value = ClassCopyException.class) public ResponseEntity businessClassCopyException(@NotNull ClassCopyException e) { log.error(e.getMessage(), e); return ResultUtil.error("ServerInternalError", 50001, "服务器内部错误"); } + /** + *

参数类型不匹配异常

+ *
+ * 用于处理参数类型不匹配异常 + * + * @param e 异常 + * @return {@link ResponseEntity} + */ @ExceptionHandler(value = MethodArgumentTypeMismatchException.class) public ResponseEntity businessMethodArgumentTypeMismatchException(@NotNull MethodArgumentTypeMismatchException e) { log.error(e.getMessage(), e); diff --git a/src/main/java/com/jsl/oa/services/impl/UserServiceImpl.java b/src/main/java/com/jsl/oa/services/impl/UserServiceImpl.java index b5f6958..8d0cd37 100755 --- a/src/main/java/com/jsl/oa/services/impl/UserServiceImpl.java +++ b/src/main/java/com/jsl/oa/services/impl/UserServiceImpl.java @@ -1,8 +1,11 @@ package com.jsl.oa.services.impl; +import com.jsl.oa.annotations.CheckUserAbleToUse; +import com.jsl.oa.annotations.CheckUserHasPermission; +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.mapper.RoleMapper; +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.*; @@ -19,14 +22,25 @@ import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; +/** + *

用户服务实现类

+ *
+ * 用户服务实现类,包含用户账号删除、用户账号锁定、用户编辑自己的信息接口 + * + * @version v1.1.0 + * @see UserService + * @see UserEditProfileVO + * @since v1.0.0 + * @author xiao_lfeng + */ @Slf4j @Service @RequiredArgsConstructor public class UserServiceImpl implements UserService { private final UserDAO userDAO; - private final RoleMapper roleMapper; - private final PermissionMapper permissionMapper; + private final RoleDAO roleDAO; + private final PermissionDAO permissionDAO; @Override public UserDO getUserInfoByUsername(String username) { @@ -38,7 +52,7 @@ public class UserServiceImpl implements UserService { log.info("\t> 执行 Service 层 UserService.userDelete 方法"); //判断用户是否存在 if (userDAO.isExistUser(id)) { - if (!Processing.checkUserIsAdmin(request, roleMapper)) { + if (!Processing.checkUserIsAdmin(request, roleDAO.roleMapper)) { return ResultUtil.error(ErrorCode.NOT_ADMIN); } // 用户是否已删除 @@ -56,7 +70,7 @@ public class UserServiceImpl implements UserService { @Override public BaseResponse userLock(HttpServletRequest request, Long id, Long isLock) { log.info("\t> 执行 Service 层 UserService.userLock 方法"); - if (!Processing.checkUserIsAdmin(request, roleMapper)) { + if (!Processing.checkUserIsAdmin(request, roleDAO.roleMapper)) { return ResultUtil.error(ErrorCode.NOT_ADMIN); } //判断用户是否存在 @@ -72,16 +86,15 @@ public class UserServiceImpl implements UserService { if (userDAO.isExistUser(userEditProfileVO.getId())) { userDAO.userEditProfile(userEditProfileVO); return ResultUtil.success("修改成功"); - } else return ResultUtil.error(ErrorCode.USER_NOT_EXIST); + } else { + return ResultUtil.error(ErrorCode.USER_NOT_EXIST); + } } @Override + @CheckUserHasPermission("user.current.all") public BaseResponse userCurrentAll(HttpServletRequest request, @NotNull UserAllCurrentVO userAllCurrentVO) { log.info("\t> 执行 Service 层 UserService.userCurrentAll 方法"); - // 检查是否是管理员用户 - if (!Processing.checkUserIsAdmin(request, roleMapper)) { - return ResultUtil.error(ErrorCode.NOT_ADMIN); - } // 检查数据 if (userAllCurrentVO.getPage() == null || userAllCurrentVO.getPage() < 1) { userAllCurrentVO.setPage(1L); @@ -114,29 +127,38 @@ public class UserServiceImpl implements UserService { } @Override + @CheckUserAbleToUse public BaseResponse userCurrent(HttpServletRequest request, String id, String username, String email, String phone) { log.info("\t> 执行 Service 层 UserService.userCurrent 方法"); - // 检查用户是否有权限继续 - log.info("\t> 检查用户是否有权限继续"); - BaseResponse userAbleNext = Processing.checkUserAbleToNext(request, userDAO.userMapper); - if (userAbleNext != null) { - return userAbleNext; - } - if (!Processing.checkUserHasPermission(request, roleMapper, permissionMapper, "")) { - return ResultUtil.error(ErrorCode.NOT_PERMISSION); - } 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, roleMapper)); + return ResultUtil.success(Processing.ReturnUserInfo(userDO, roleDAO.roleMapper)); } else { return ResultUtil.error(ErrorCode.USER_NOT_EXIST); } } else { // 检查是否是管理员用户 - if (!Processing.checkUserIsAdmin(request, roleMapper)) { - return ResultUtil.error(ErrorCode.NOT_ADMIN); + Long userId = Processing.getAuthHeaderToUserId(request); + if (userId != null) { + List getPermission = permissionDAO.getPermission(userId); + // 匹配权限 + if (!getPermission.contains("user.current")) { + log.info("\t> 用户权限不足,检查是否是管理员"); + // 检查用户是管理员 + RoleUserDO roleUserDO = roleDAO.roleMapper.getRoleUserByUid(Processing.getAuthHeaderToUserId(request)); + if (roleUserDO != null) { + RoleDO roleDO = roleDAO.roleMapper.getRoleByRoleName("admin"); + if (!roleUserDO.getRid().equals(roleDO.getId())) { + return ResultUtil.error(ErrorCode.NOT_PERMISSION); + } + } else { + return ResultUtil.error(ErrorCode.NOT_PERMISSION); + } + } + } else { + return ResultUtil.error(ErrorCode.TOKEN_NOT_EXIST); } // 根据顺序优先级进行用户信息获取 UserDO userDO = null; @@ -151,7 +173,7 @@ public class UserServiceImpl implements UserService { } // 返回结果 if (userDO != null) { - return ResultUtil.success(Processing.ReturnUserInfo(userDO, roleMapper)); + return ResultUtil.success(Processing.ReturnUserInfo(userDO, roleDAO.roleMapper)); } else { return ResultUtil.error(ErrorCode.USER_NOT_EXIST); } @@ -163,7 +185,7 @@ public class UserServiceImpl implements UserService { public BaseResponse userAdd(UserAddVO userAddVo, HttpServletRequest request) { log.info("\t> 执行 Service 层 UserService.userAdd 方法"); // 检测用户是否为管理员 - if (!Processing.checkUserIsAdmin(request, roleMapper)) { + if (!Processing.checkUserIsAdmin(request, roleDAO.roleMapper)) { return ResultUtil.error(ErrorCode.NOT_ADMIN); } //如果用户不重复,添加用户 @@ -199,7 +221,7 @@ public class UserServiceImpl implements UserService { public BaseResponse userEdit(UserEditVO userEditVO, HttpServletRequest request) { log.info("\t> 执行 Service 层 userEdit 方法"); // 检测用户是否为管理员 - if (!Processing.checkUserIsAdmin(request, roleMapper)) { + if (!Processing.checkUserIsAdmin(request, roleDAO.roleMapper)) { return ResultUtil.error(ErrorCode.NOT_ADMIN); } //根据id获取用户信息 diff --git a/src/main/java/com/jsl/oa/utils/ErrorCode.java b/src/main/java/com/jsl/oa/utils/ErrorCode.java index 0ec858f..e790b0a 100755 --- a/src/main/java/com/jsl/oa/utils/ErrorCode.java +++ b/src/main/java/com/jsl/oa/utils/ErrorCode.java @@ -3,6 +3,15 @@ package com.jsl.oa.utils; import lombok.Getter; import lombok.extern.slf4j.Slf4j; +/** + *

错误码

+ *
+ * 用于定义错误码 + * + * @version v1.1.0 + * @since v1.0.0 + * @author xiao_lfeng + */ @Slf4j @Getter public enum ErrorCode { @@ -30,6 +39,7 @@ public enum ErrorCode { USER_ALREADY_DELETE("UserAlreadyDelete", 40306, "用户已被删除"), USER_DISABLED("UserDisabled", 40307, "用户已被禁用"), USER_LOCKED("UserLocked", 40308, "用户已被锁定"), + USER_EXPIRED("UserExpired", 40309, "用户已过期"), ID_NOT_EXIST("IdNotExist", 40400, "ID不存在"), ROLE_NOT_FOUNDED("RoleNotFounded", 40401, "角色不存在"), ROLE_NAME_REPEAT("RoleNameRepeat", 40402, "角色名称重复"), diff --git a/src/main/java/com/jsl/oa/utils/Processing.java b/src/main/java/com/jsl/oa/utils/Processing.java index efe3183..63080d8 100755 --- a/src/main/java/com/jsl/oa/utils/Processing.java +++ b/src/main/java/com/jsl/oa/utils/Processing.java @@ -1,15 +1,14 @@ package com.jsl.oa.utils; import com.jsl.oa.exception.ClassCopyException; -import com.jsl.oa.mapper.PermissionMapper; import com.jsl.oa.mapper.RoleMapper; -import com.jsl.oa.mapper.UserMapper; import com.jsl.oa.model.doData.PermissionDO; 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.PermissionContentVo; 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.validation.BindingResult; @@ -236,7 +235,8 @@ public class Processing { * @Description: 将性别转为字符形式 * @Date: 2024/1/18 **/ - public static String getSex(short sex){ + @Contract(pure = true) + public static @NotNull String getSex(short sex){ if(sex == 0){ return "保密"; } @@ -368,32 +368,4 @@ public class Processing { return vo; } - - public static @Nullable BaseResponse checkUserAbleToNext(HttpServletRequest request, @NotNull UserMapper userMapper) { - Long userId = Processing.getAuthHeaderToUserId(request); - // 获取用户信息 - UserDO userDO = userMapper.getUserById(userId); - // 用户不存在 - if (userDO == null) { - return ResultUtil.error(ErrorCode.USER_NOT_EXIST); - } - // 用户是否被禁用 - if (!userDO.getEnabled()) { - return ResultUtil.error(ErrorCode.USER_DISABLED); - } - // 用户是否被封禁 - if (!userDO.getAccountNoLocked()) { - return ResultUtil.error(ErrorCode.USER_LOCKED); - } - // 用户是否被删除 - if (userDO.getIsDelete()) { - return ResultUtil.error(ErrorCode.USER_ALREADY_DELETE); - } - return null; - } - - public static boolean checkUserHasPermission(HttpServletRequest request, RoleMapper roleMapper, PermissionMapper permissionMapper, String permission) { - // TODO: 10003-用户权限及权限组校验 - return true; - } } diff --git a/src/main/java/com/jsl/oa/utils/ResultUtil.java b/src/main/java/com/jsl/oa/utils/ResultUtil.java index c3dc628..af924a4 100755 --- a/src/main/java/com/jsl/oa/utils/ResultUtil.java +++ b/src/main/java/com/jsl/oa/utils/ResultUtil.java @@ -5,6 +5,15 @@ import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.springframework.http.ResponseEntity; +/** + *

结果工具类

+ *
+ * 用于返回结果 + * + * @version v1.1.0 + * @since v1.1.0 + * @author xiao_lfeng + */ @Slf4j public class ResultUtil { @@ -60,7 +69,7 @@ public class ResultUtil { public static @NotNull ResponseEntity error(String output, Integer code, String message) { log.warn("失败: 错误码[" + code + "] {} - {}", output, message); log.info("=================================================="); - return ResponseEntity.status(code) + return ResponseEntity.status(500) .body(new BaseResponse(output, code, message)); } } diff --git a/src/main/java/com/jsl/oa/utils/redis/TokenRedisUtil.java b/src/main/java/com/jsl/oa/utils/redis/TokenRedisUtil.java index 46d5a4d..a7dfe2c 100644 --- a/src/main/java/com/jsl/oa/utils/redis/TokenRedisUtil.java +++ b/src/main/java/com/jsl/oa/utils/redis/TokenRedisUtil.java @@ -35,21 +35,18 @@ public class TokenRedisUtil extends RedisOperating { @Override public Long getExpiredAt(@NotNull BusinessConstants businessConstants, String field) { String key = RedisConstant.TYPE_AUTH + RedisConstant.TABLE_TOKEN + businessConstants.getValue() + field; - log.info("\t\t> 读取 Redis 键为 {} 的过期时间", key); return redisTemplate.getExpire(key); } @Override public Boolean delData(@NotNull BusinessConstants businessConstants, String field) { String key = RedisConstant.TYPE_AUTH + RedisConstant.TABLE_TOKEN + businessConstants.getValue() + field; - log.info("\t\t> 删除 Redis 键为 {} 的数据", key); return redisTemplate.delete(key); } @Override public R getData(@NotNull BusinessConstants businessConstants, String field) { String key = RedisConstant.TYPE_AUTH + RedisConstant.TABLE_TOKEN + businessConstants.getValue() + field; - log.info("\t\t> 读取 Redis 键为 {} 的数据", key); return redisTemplate.opsForValue().get(key); } @@ -57,7 +54,6 @@ public class TokenRedisUtil extends RedisOperating { public Boolean setData(@NotNull BusinessConstants businessConstants, String field, R value, Integer time) { // 处理数据 String key = RedisConstant.TYPE_AUTH + RedisConstant.TABLE_TOKEN + businessConstants.getValue() + field; - log.info("\t\t> 写入 Redis 键为 {} 的数据", key); redisTemplate.opsForValue().set(key, value); redisTemplate.expire(key, time, TimeUnit.MINUTES); return true; @@ -65,7 +61,6 @@ public class TokenRedisUtil extends RedisOperating { public List getList(@NotNull BusinessConstants businessConstants) { String key = RedisConstant.TYPE_AUTH + RedisConstant.TABLE_TOKEN + businessConstants.getValue() + "*"; - log.info("\t\t> 读取 Redis 键为 {} 的数据", key); return this.getList(key); } }