From 1a12bcc49d4a429afdb33254d90eb2ddbaa1a72d Mon Sep 17 00:00:00 2001 From: XiaoLFeng Date: Tue, 23 Jan 2024 16:50:22 +0800 Subject: [PATCH] =?UTF-8?q?patch:=20=E6=97=A5=E5=BF=97=E4=BF=AE=E8=A1=A5?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0Redis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jsl/oa/aspect/AuthControllerAspect.java | 6 +- .../oa/common/constant/BusinessConstants.java | 8 ++ .../java/com/jsl/oa/dao/PermissionDAO.java | 98 +++++++++++++++---- src/main/java/com/jsl/oa/dao/RoleDAO.java | 60 ++++++++++-- src/main/java/com/jsl/oa/dao/UserDAO.java | 8 +- .../jsl/oa/services/impl/AuthServiceImpl.java | 27 +++-- .../jsl/oa/services/impl/InfoServiceImpl.java | 11 +++ .../services/impl/PermissionServiceImpl.java | 47 +++++---- .../jsl/oa/services/impl/UserServiceImpl.java | 34 ++----- .../java/com/jsl/oa/utils/Processing.java | 18 +++- .../com/jsl/oa/utils/redis/RoleRedisUtil.java | 62 ++++++++++++ 11 files changed, 291 insertions(+), 88 deletions(-) create mode 100644 src/main/java/com/jsl/oa/utils/redis/RoleRedisUtil.java diff --git a/src/main/java/com/jsl/oa/aspect/AuthControllerAspect.java b/src/main/java/com/jsl/oa/aspect/AuthControllerAspect.java index 923d863..51bf162 100755 --- a/src/main/java/com/jsl/oa/aspect/AuthControllerAspect.java +++ b/src/main/java/com/jsl/oa/aspect/AuthControllerAspect.java @@ -71,7 +71,11 @@ public class AuthControllerAspect { "&& !execution(* com.jsl.oa.controllers.AuthController.authLoginByEmail(..))" + "&& !execution(* com.jsl.oa.controllers.AuthController.authForgetPassword(..))" + "&& !execution(* com.jsl.oa.controllers.AuthController.authLogin(..))" + - "&& !execution(* com.jsl.oa.controllers.AuthController.authRegister(..))") + "&& !execution(* com.jsl.oa.controllers.AuthController.authRegister(..)) " + + "&& !execution(* com.jsl.oa.controllers.IndexController.*(..)) " + + "&& !execution(* com.jsl.oa.controllers.CustomController.*(..)) " + + "&& !execution(* com.jsl.oa.controllers.InfoController.infoGetHeaderImage(..)) " + + "&& !execution(* com.jsl.oa.controllers.InfoController.infoGetHeaderUser(..))") public Object tokenControllerAround(ProceedingJoinPoint pjp) throws Throwable { // 获取 HttpServletRequest 对象 HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); diff --git a/src/main/java/com/jsl/oa/common/constant/BusinessConstants.java b/src/main/java/com/jsl/oa/common/constant/BusinessConstants.java index 25cfd8b..48006c6 100644 --- a/src/main/java/com/jsl/oa/common/constant/BusinessConstants.java +++ b/src/main/java/com/jsl/oa/common/constant/BusinessConstants.java @@ -3,11 +3,19 @@ package com.jsl.oa.common.constant; import lombok.Getter; /** + *

业务常量

+ *
+ * 业务常量 * + * @since v1.1.0 + * @version v1.1.0 + * @author xiao_lfeng */ @Getter public enum BusinessConstants { BUSINESS_LOGIN("login:", "登陆实现"), + ALL_PERMISSION("all:", "所有权限"), + USER("user:", "用户"), NONE("", "null"); private final String value; diff --git a/src/main/java/com/jsl/oa/dao/PermissionDAO.java b/src/main/java/com/jsl/oa/dao/PermissionDAO.java index fc4a9e5..2ac5210 100644 --- a/src/main/java/com/jsl/oa/dao/PermissionDAO.java +++ b/src/main/java/com/jsl/oa/dao/PermissionDAO.java @@ -5,7 +5,7 @@ import com.google.gson.reflect.TypeToken; import com.jsl.oa.common.constant.BusinessConstants; import com.jsl.oa.mapper.PermissionMapper; import com.jsl.oa.model.doData.PermissionDO; -import com.jsl.oa.utils.redis.PermissionRedisUtil; +import com.jsl.oa.utils.redis.RoleRedisUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; @@ -28,7 +28,7 @@ import java.util.List; @RequiredArgsConstructor public class PermissionDAO { private final PermissionMapper permissionMapper; - private final PermissionRedisUtil permissionRedisUtil; + private final RoleRedisUtil roleRedisUtil; private final Gson gson; /** @@ -42,27 +42,14 @@ public class PermissionDAO { public List getPermission(@NotNull Long uid) { log.info("\t> 执行 DAO 层 PermissionDAO.getPermission 方法"); List getPermissionForString; - String permissionRedisString = permissionRedisUtil.getData(BusinessConstants.NONE, uid.toString()); + String permissionRedisString = roleRedisUtil.getData(BusinessConstants.NONE, uid.toString()); if (permissionRedisString == null) { log.info("\t\t> 从 MySQL 获取数据"); List permissionList = permissionMapper.permissionUserPid(uid); getPermissionForString = new ArrayList<>(); - 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()); - } + forPermissionToBuildString(permissionList, getPermissionForString); // 存入 Redis - permissionRedisUtil.setData(BusinessConstants.NONE, uid.toString(), gson.toJson(getPermissionForString), 1440); + roleRedisUtil.setData(BusinessConstants.NONE, uid.toString(), gson.toJson(getPermissionForString), 1440); } else { log.info("\t\t> 从 Redis 获取数据"); getPermissionForString = gson.fromJson(permissionRedisString, new TypeToken>() {}.getType()); @@ -70,14 +57,83 @@ public class PermissionDAO { return getPermissionForString; } + public List getAllPermissionBuildString() { + log.info("\t> 执行 DAO 层 PermissionDAO.getPermission 方法"); + List getPermissionForString; + String getRedisData = roleRedisUtil.getData(BusinessConstants.ALL_PERMISSION, "string"); + if (getRedisData == null) { + log.info("\t\t> 从 MySQL 获取数据"); + List permissionList = permissionMapper.getAllPermission(); + permissionList.removeIf(it -> it.getPid() != null); + getPermissionForString = new ArrayList<>(); + forPermissionToBuildString(permissionList, getPermissionForString); + // 存入 Redis + roleRedisUtil.setData(BusinessConstants.ALL_PERMISSION, "string", gson.toJson(getPermissionForString), 1440); + } else { + log.info("\t\t> 从 Redis 获取数据"); + getPermissionForString = gson.fromJson(getRedisData, new TypeToken>() {}.getType()); + } + return getPermissionForString; + } + + public List getRootPermission() { + log.info("\t> 执行 DAO 层 PermissionDAO.getRootPermission 方法"); + String getRedisData = roleRedisUtil.getData(BusinessConstants.ALL_PERMISSION, "all"); + if (getRedisData == null) { + log.info("\t\t> 从 MySQL 获取数据"); + List permissionList = permissionMapper.getAllPermission(); + if (!permissionList.isEmpty()) { + List 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 { + log.info("\t\t> 从 Redis 获取数据"); + return gson.fromJson(getRedisData, new TypeToken>() { + }.getType()); + } + } + + /** + *

获取全部权限信息

+ *
+ * 获取全部权限信息 + * + * @param permissionList 权限信息 + * @param getPermissionForString 存储权限信息 + */ + private void forPermissionToBuildString(@NotNull List permissionList, List 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()); + } + } + /** *

获取子类权限信息

*
* 通过父类 ID 获取子类权限信息
* 递归调用 * - * @param permissionString 父类权限信息 - * @param id 父类 ID + * @param permissionString 父类权限信息 + * @param id 父类 ID * @param getPermissionForString 存储权限信息 */ private void getChildPermission(StringBuilder permissionString, Long id, List getPermissionForString) { @@ -111,7 +167,7 @@ public class PermissionDAO { * 递归调用 * * @param permissionString 父类权限信息 - * @param pid 父类 ID + * @param pid 父类 ID */ public void getFatherPermission(StringBuilder permissionString, Long pid) { // 获取权限信息 diff --git a/src/main/java/com/jsl/oa/dao/RoleDAO.java b/src/main/java/com/jsl/oa/dao/RoleDAO.java index a526c73..69bff31 100644 --- a/src/main/java/com/jsl/oa/dao/RoleDAO.java +++ b/src/main/java/com/jsl/oa/dao/RoleDAO.java @@ -1,7 +1,12 @@ package com.jsl.oa.dao; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.jsl.oa.common.constant.BusinessConstants; import com.jsl.oa.mapper.RoleMapper; import com.jsl.oa.model.doData.RoleDO; +import com.jsl.oa.model.doData.RoleUserDO; +import com.jsl.oa.utils.redis.RoleRedisUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -14,6 +19,8 @@ import java.util.List; @RequiredArgsConstructor public class RoleDAO { public final RoleMapper roleMapper; + private final Gson gson; + private final RoleRedisUtil roleRedisUtil; public void roleAddUser(Long uid, Long rid) { log.info("\t> 执行 DAO 层 RoleDAO.roleAddUser 方法"); @@ -37,32 +44,67 @@ public class RoleDAO { public RoleDO getRoleById(Long id) { log.info("\t> 执行 DAO 层 RoleDAO.getRoleById 方法"); - log.info("\t\t> 从 MySQL 获取数据"); - return roleMapper.getRoleById(id); + String getRedisData = roleRedisUtil.getData(BusinessConstants.NONE, "all"); + if (getRedisData == null) { + log.info("\t\t> 从 MySQL 获取数据"); + return roleMapper.getRoleById(id); + } else { + log.info("\t\t> 从 Redis 获取数据"); + List roleList = gson.fromJson(getRedisData, new TypeToken>() {}.getType()); + for (RoleDO roleDO : roleList) { + if (roleDO.getId().equals(id)) { + return roleDO; + } + } + return null; + } } public List getRole() { log.info("\t> 执行 DAO 层 RoleDAO.getRole 方法"); - log.info("\t\t> 从 MySQL 获取数据"); - return roleMapper.getRole(); + String getRedisData = roleRedisUtil.getData(BusinessConstants.NONE, "all"); + if (getRedisData == null) { + log.info("\t\t> 从 MySQL 获取数据"); + List roleList = roleMapper.getRole(); + roleRedisUtil.setData(BusinessConstants.NONE, "all", gson.toJson(roleList), 1440); + return roleList; + } else { + log.info("\t\t> 从 Redis 获取数据"); + return gson.fromJson(getRedisData, new TypeToken>() {}.getType()); + } } public void roleAdd(RoleDO roleDO) { log.info("\t> 执行 DAO 层 RoleDAO.roleAdd 方法"); log.info("\t\t> 从 MySQL 获取数据"); roleMapper.roleAdd(roleDO); + List roleList = roleMapper.getRole(); + roleRedisUtil.setData(BusinessConstants.NONE, "all", gson.toJson(roleList), 1440); + } public boolean roleEdit(RoleDO getRole) { log.info("\t> 执行 DAO 层 RoleDAO.roleEdit 方法"); log.info("\t\t> 从 MySQL 获取数据"); - return roleMapper.roleEdit(getRole); + if (roleMapper.roleEdit(getRole)) { + List roleList = roleMapper.getRole(); + roleRedisUtil.setData(BusinessConstants.NONE, "all", gson.toJson(roleList), 1440); + return true; + } else { + return false; + } } public boolean roleDelete(Long id) { log.info("\t> 执行 DAO 层 RoleDAO.roleDelete 方法"); log.info("\t\t> 从 MySQL 获取数据"); - return roleMapper.roleDelete(id); + if (roleMapper.roleDelete(id)) { + List roleList = roleMapper.getRole(); + roleRedisUtil.setData(BusinessConstants.NONE, "all", gson.toJson(roleList), 1440); + return true; + } else { + return false; + } } public boolean isExistRoleByRoleName(String roleName) { @@ -77,4 +119,10 @@ public class RoleDAO { log.info("\t\t> 从 MySQL 获取数据"); return roleMapper.roleChangeUser(uid, rid); } + + public RoleUserDO getRoleUserByUid(Long uid) { + log.info("\t> 执行 DAO 层 RoleDAO.getRoleUserByUid 方法"); + log.info("\t\t> 从 MySQL 获取数据"); + return roleMapper.getRoleUserByUid(uid); + } } diff --git a/src/main/java/com/jsl/oa/dao/UserDAO.java b/src/main/java/com/jsl/oa/dao/UserDAO.java index 9dea3e2..042e190 100755 --- a/src/main/java/com/jsl/oa/dao/UserDAO.java +++ b/src/main/java/com/jsl/oa/dao/UserDAO.java @@ -2,7 +2,6 @@ package com.jsl.oa.dao; import com.google.gson.Gson; import com.jsl.oa.common.constant.BusinessConstants; -import com.jsl.oa.mapper.RoleMapper; import com.jsl.oa.mapper.UserMapper; import com.jsl.oa.model.doData.RoleDO; import com.jsl.oa.model.doData.RoleUserDO; @@ -26,7 +25,8 @@ import java.util.List; public class UserDAO { public final UserMapper userMapper; - private final RoleMapper roleMapper; + private final RoleDAO roleDAO; + private final PermissionDAO permissionDAO; private final Gson gson; private final UserRedisUtil userRedisUtil; @@ -126,7 +126,7 @@ public class UserDAO { List userCurrentDO = userMapper.getAllUser(userAllCurrentVO); List userCurrentDOList = new ArrayList<>(); userCurrentDO.forEach(it -> { - userCurrentDOList.add(Processing.ReturnUserInfo(it, roleMapper)); + userCurrentDOList.add(Processing.returnUserInfo(it, roleDAO, permissionDAO)); }); return userCurrentDOList; @@ -138,7 +138,7 @@ public class UserDAO { List userCurrentDO = userMapper.getAllUserBySearch(userAllCurrentVO); List userCurrentDOList = new ArrayList<>(); userCurrentDO.forEach(it -> { - userCurrentDOList.add(Processing.ReturnUserInfo(it, roleMapper)); + userCurrentDOList.add(Processing.returnUserInfo(it, roleDAO, permissionDAO)); }); return userCurrentDOList; } diff --git a/src/main/java/com/jsl/oa/services/impl/AuthServiceImpl.java b/src/main/java/com/jsl/oa/services/impl/AuthServiceImpl.java index efadf58..94e4b3e 100755 --- a/src/main/java/com/jsl/oa/services/impl/AuthServiceImpl.java +++ b/src/main/java/com/jsl/oa/services/impl/AuthServiceImpl.java @@ -1,7 +1,9 @@ package com.jsl.oa.services.impl; +import com.jsl.oa.annotations.CheckUserAbleToUse; import com.jsl.oa.common.constant.BusinessConstants; -import com.jsl.oa.mapper.RoleMapper; +import com.jsl.oa.dao.PermissionDAO; +import com.jsl.oa.dao.RoleDAO; import com.jsl.oa.mapper.UserMapper; import com.jsl.oa.model.doData.RoleUserDO; import com.jsl.oa.model.doData.UserDO; @@ -19,7 +21,7 @@ import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; import java.sql.Timestamp; -import java.util.ArrayList; +import java.util.List; import java.util.regex.Pattern; /** @@ -30,13 +32,15 @@ import java.util.regex.Pattern; * @version v1.1.0 * @see AuthService * @since v1.0.0 + * @author xiao_lfeng */ @Slf4j @Service @RequiredArgsConstructor public class AuthServiceImpl implements AuthService { private final UserMapper userMapper; - private final RoleMapper roleMapper; + private final RoleDAO roleDAO; + private final PermissionDAO permissionDAO; private final MailService mailService; private final EmailRedisUtil emailRedisUtil; @@ -167,6 +171,7 @@ public class AuthServiceImpl implements AuthService { } @Override + @CheckUserAbleToUse public BaseResponse authChangePassword(HttpServletRequest request, @NotNull UserChangePasswordVO userChangePasswordVO) { log.info("\t> 执行 Service 层 AuthService.authChangePassword 方法"); // 检查新密码输入无误 @@ -193,6 +198,7 @@ public class AuthServiceImpl implements AuthService { } @Override + @CheckUserAbleToUse public BaseResponse authLogout(HttpServletRequest request) { log.info("\t> 执行 Service 层 AuthService.authLogout 方法"); // 获取用户 @@ -206,7 +212,7 @@ public class AuthServiceImpl implements AuthService { } @Override - public BaseResponse authForgetPassword(UserForgetPasswordVO userForgetPasswordVO) { + public BaseResponse authForgetPassword(@NotNull UserForgetPasswordVO userForgetPasswordVO) { log.info("\t> 执行 Service 层 AuthService.authForgetPassword 方法"); // 获取验证码是否有效 Integer redisCode = emailRedisUtil.getData(BusinessConstants.BUSINESS_LOGIN, userForgetPasswordVO.getEmail()); @@ -242,8 +248,17 @@ public class AuthServiceImpl implements AuthService { UserReturnBackVO userReturnBackVO = new UserReturnBackVO(); // Token 上传到 Redis tokenRedisUtil.setData(BusinessConstants.BUSINESS_LOGIN, userDO.getId().toString(), token, 1440); + RoleUserDO roleUserDO = roleDAO.getRoleUserByUid(userDO.getId()); + List getPermissionForString; + if (roleUserDO != null) { + // 获取全部根权限 + getPermissionForString = permissionDAO.getAllPermissionBuildString(); + } else { + // 获取权限列表信息 + getPermissionForString = permissionDAO.getPermission(userDO.getId()); + } // 获取用户角色 - RoleUserDO getUserRole = roleMapper.getRoleUserByUid(userDO.getId()); + RoleUserDO getUserRole = roleDAO.roleMapper.getRoleUserByUid(userDO.getId()); if (getUserRole == null) { getUserRole = new RoleUserDO(); getUserRole.setRid(0L) @@ -260,7 +275,7 @@ public class AuthServiceImpl implements AuthService { .setRole(new UserReturnBackVO.ReturnUserRole() .setRid(getUserRole.getRid())) .setToken(token) - .setPermission(new ArrayList<>()); + .setPermission(getPermissionForString); return ResultUtil.success("登陆成功", userReturnBackVO); } } diff --git a/src/main/java/com/jsl/oa/services/impl/InfoServiceImpl.java b/src/main/java/com/jsl/oa/services/impl/InfoServiceImpl.java index a33c9d6..8a3e03e 100644 --- a/src/main/java/com/jsl/oa/services/impl/InfoServiceImpl.java +++ b/src/main/java/com/jsl/oa/services/impl/InfoServiceImpl.java @@ -1,5 +1,6 @@ package com.jsl.oa.services.impl; +import com.jsl.oa.annotations.CheckUserHasPermission; import com.jsl.oa.dao.InfoDAO; import com.jsl.oa.dao.UserDAO; import com.jsl.oa.mapper.RoleMapper; @@ -21,6 +22,15 @@ import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; +/** + *

信息服务层实现类

+ *
+ * 用于信息服务层的实现类 + * + * @since v1.0.0 + * @version v1.1.0 + * @author xiao_lfeng + */ @Slf4j @Service @RequiredArgsConstructor @@ -30,6 +40,7 @@ public class InfoServiceImpl implements InfoService { private final UserDAO userDAO; @Override + @CheckUserHasPermission("") public BaseResponse addHeaderImage(HttpServletRequest request, CarouselVO carouselVO) { log.info("\t> 执行 Service 层 InfoService.addHeaderImage 方法"); // 用户权限校验 diff --git a/src/main/java/com/jsl/oa/services/impl/PermissionServiceImpl.java b/src/main/java/com/jsl/oa/services/impl/PermissionServiceImpl.java index 896fdf6..8c5ef92 100644 --- a/src/main/java/com/jsl/oa/services/impl/PermissionServiceImpl.java +++ b/src/main/java/com/jsl/oa/services/impl/PermissionServiceImpl.java @@ -1,10 +1,12 @@ package com.jsl.oa.services.impl; +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.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.services.PermissionService; @@ -19,32 +21,48 @@ import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; import java.util.List; +/** + *

权限服务层实现类

+ *
+ * 用于权限服务层的实现类,实现权限的增删改查,以及用户权限的获取 + * + * @since v1.0.0 + * @version v1.1.0 + * @author xiao_lfeng | xiangZr-hhh | 176yunxuan + */ @Slf4j @Service @RequiredArgsConstructor public class PermissionServiceImpl implements PermissionService { private final PermissionMapper permissionMapper; - private final RoleMapper roleMapper; + private final RoleDAO roleDAO; private final PermissionDAO permissionDAO; private final UserDAO userDAO; @Override + @CheckUserHasPermission("permission.add") public BaseResponse permissionAdd(HttpServletRequest request, Long rid, Long pid) { log.info("\t> 执行 Service 层 PermissionService.permissionAdd 方法"); - if (!Processing.checkUserIsAdmin(request, roleMapper)) { - return ResultUtil.error(ErrorCode.NOT_ADMIN); - } permissionMapper.permissionAdd(rid, pid); return ResultUtil.success(); } @Override + @CheckUserHasPermission("permission.user") public BaseResponse permissionUser(HttpServletRequest request, Long uid) { log.info("\t> 执行 Service 层 PermissionService.permissionUserPid 方法"); if (userDAO.isExistUser(uid)) { - // 获取权限列表信息 - List getPermissionForString = permissionDAO.getPermission(uid); + // 此用户是否为管理员 + RoleUserDO roleUserDO = roleDAO.getRoleUserByUid(uid); + List getPermissionForString; + if (roleUserDO != null) { + // 获取全部根权限 + getPermissionForString = permissionDAO.getAllPermissionBuildString(); + } else { + // 获取权限列表信息 + getPermissionForString = permissionDAO.getPermission(uid); + } return ResultUtil.success(getPermissionForString); } return ResultUtil.error(ErrorCode.USER_NOT_EXIST); @@ -52,12 +70,9 @@ public class PermissionServiceImpl implements PermissionService { @Override + @CheckUserHasPermission("permission.get") public BaseResponse permissionGet(HttpServletRequest request) { log.info("\t> 执行 Service 层 PermissionService.permissionGet 方法"); - //检验用户权限是否为管理员 - if (!Processing.checkUserIsAdmin(request, roleMapper)) { - return ResultUtil.error(ErrorCode.NOT_ADMIN); - } //获取所有权限数据 List permissionDOList = permissionMapper.getAllPermission(); //将数据按父子类封装 @@ -67,12 +82,9 @@ public class PermissionServiceImpl implements PermissionService { } @Override + @CheckUserHasPermission("permission.edit") public BaseResponse permissionEdit(PermissionEditVO permissionEditVo, HttpServletRequest request) { log.info("\t> 执行 Service 层 PermissionService.permissionEdit 方法"); - //检验用户权限是否为管理员 - if (!Processing.checkUserIsAdmin(request, roleMapper)) { - return ResultUtil.error(ErrorCode.NOT_ADMIN); - } //根据id获取对应permission数据 PermissionDO permissionDO = permissionMapper.getPermissionById(permissionEditVo.getId()); if (permissionDO == null) { @@ -88,12 +100,9 @@ public class PermissionServiceImpl implements PermissionService { } @Override + @CheckUserHasPermission("permission.delete") public BaseResponse permissionDelete(HttpServletRequest request, Long pid) { log.info("\t> 执行 Service 层 PermissionService.permissionDelete 方法"); - //检验用户权限是否为管理员 - if (!Processing.checkUserIsAdmin(request, roleMapper)) { - return ResultUtil.error(ErrorCode.NOT_ADMIN); - } //删除权限 if (!permissionMapper.deletePermission(pid)) { return ResultUtil.error(ErrorCode.DATABASE_DELETE_ERROR); 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 8d0cd37..a9c3c75 100755 --- a/src/main/java/com/jsl/oa/services/impl/UserServiceImpl.java +++ b/src/main/java/com/jsl/oa/services/impl/UserServiceImpl.java @@ -10,7 +10,10 @@ 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; -import com.jsl.oa.utils.*; +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.jetbrains.annotations.NotNull; @@ -134,7 +137,7 @@ public class UserServiceImpl implements UserService { // Token获取信息 UserDO userDO = userDAO.getUserById(Processing.getAuthHeaderToUserId(request)); if (userDO != null) { - return ResultUtil.success(Processing.ReturnUserInfo(userDO, roleDAO.roleMapper)); + return ResultUtil.success(Processing.returnUserInfo(userDO, roleDAO, permissionDAO)); } else { return ResultUtil.error(ErrorCode.USER_NOT_EXIST); } @@ -173,7 +176,7 @@ public class UserServiceImpl implements UserService { } // 返回结果 if (userDO != null) { - return ResultUtil.success(Processing.ReturnUserInfo(userDO, roleDAO.roleMapper)); + return ResultUtil.success(Processing.returnUserInfo(userDO, roleDAO, permissionDAO)); } else { return ResultUtil.error(ErrorCode.USER_NOT_EXIST); } @@ -260,29 +263,4 @@ public class UserServiceImpl implements UserService { userProfileVo.setSex(Processing.getSex(userDO.getSex())); return ResultUtil.success(userProfileVo); } - - - /** - * @Description: 判断用户是否为管理员 - * @Date: 2024/1/18 - * @Param request: 请求头 - **/ - public BaseResponse isManager(HttpServletRequest request) { - //获取token - String originalAuthorization = request.getHeader("Authorization"); - String token = originalAuthorization.replace("Bearer ", ""); - //获取操作用户的权限 - RoleUserDO roleUserDO = userDAO.getRoleFromUser(JwtUtil.getUserId(token)); - //用户权限不为空 - if (roleUserDO == null) { - return ResultUtil.error(ErrorCode.USER_ROLE_NOT_EXIST); - } - //用户权限应为管理员 - if (!userDAO.isManagerByRoleId(roleUserDO.getRid())) { - return ResultUtil.error(ErrorCode.USER_ROLE_NOT_MANAGER); - } - return ResultUtil.success(); - } - - } diff --git a/src/main/java/com/jsl/oa/utils/Processing.java b/src/main/java/com/jsl/oa/utils/Processing.java index 63080d8..8cd23bd 100755 --- a/src/main/java/com/jsl/oa/utils/Processing.java +++ b/src/main/java/com/jsl/oa/utils/Processing.java @@ -1,5 +1,7 @@ package com.jsl.oa.utils; +import com.jsl.oa.dao.PermissionDAO; +import com.jsl.oa.dao.RoleDAO; import com.jsl.oa.exception.ClassCopyException; import com.jsl.oa.mapper.RoleMapper; import com.jsl.oa.model.doData.PermissionDO; @@ -257,10 +259,10 @@ public class Processing { * @param userDO 用户信息 * @return {@link BaseResponse} */ - public static @NotNull UserCurrentBackVO ReturnUserInfo(@NotNull UserDO userDO, RoleMapper roleMapper) { + public static @NotNull UserCurrentBackVO returnUserInfo(@NotNull UserDO userDO, RoleDAO roleDAO, PermissionDAO permissionDAO) { UserCurrentBackVO userCurrentBackVO = new UserCurrentBackVO(); // 获取用户角色 - RoleUserDO getUserRole = roleMapper.getRoleUserByUid(userDO.getId()); + RoleUserDO getUserRole = roleDAO.getRoleUserByUid(userDO.getId()); if (getUserRole == null) { getUserRole = new RoleUserDO(); getUserRole.setRid(0L) @@ -268,6 +270,16 @@ public class Processing { } else { getUserRole.setUid(null); } + // 获取用户权限 + RoleUserDO roleUserDO = roleDAO.getRoleUserByUid(userDO.getId()); + List getPermissionForString; + if (roleUserDO != null) { + // 获取全部根权限 + getPermissionForString = permissionDAO.getAllPermissionBuildString(); + } else { + // 获取权限列表信息 + getPermissionForString = permissionDAO.getPermission(userDO.getId()); + } userCurrentBackVO.setUser(new UserCurrentBackVO.ReturnUser() .setId(userDO.getId()) .setJobId(userDO.getJobId()) @@ -291,7 +303,7 @@ public class Processing { .setIsDelete(userDO.getIsDelete())) .setRole(new UserCurrentBackVO.ReturnUserRole() .setRid(getUserRole.getRid())) - .setPermission(new ArrayList<>()); + .setPermission(getPermissionForString); return userCurrentBackVO; } diff --git a/src/main/java/com/jsl/oa/utils/redis/RoleRedisUtil.java b/src/main/java/com/jsl/oa/utils/redis/RoleRedisUtil.java new file mode 100644 index 0000000..aa3db0d --- /dev/null +++ b/src/main/java/com/jsl/oa/utils/redis/RoleRedisUtil.java @@ -0,0 +1,62 @@ +package com.jsl.oa.utils.redis; + +import com.jsl.oa.common.constant.BusinessConstants; +import com.jsl.oa.common.constant.RedisConstant; +import com.jsl.oa.config.redis.RedisOperating; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.concurrent.TimeUnit; + +/** + *

角色Redis工具类

+ *
+ * 角色Redis工具类 + * + * @since v1.1.0 + * @version v1.1.0 + * @see com.jsl.oa.common.constant.RedisConstant + * @see com.jsl.oa.common.constant.BusinessConstants + * @see com.jsl.oa.config.redis.RedisOperating + * @author xiao_lfeng + */ +@Slf4j +@Component +public class RoleRedisUtil extends RedisOperating { + public RoleRedisUtil(RedisTemplate redisTemplate, StringRedisTemplate stringRedisTemplate) { + super(redisTemplate, stringRedisTemplate); + } + + @Override + public Long getExpiredAt(@NotNull BusinessConstants businessConstants, String field) { + String key = RedisConstant.TYPE_AUTH + RedisConstant.TABLE_ROLE + 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_ROLE + 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_ROLE + businessConstants.getValue() + field; + log.info("\t\t> 读取 Redis 键为 {} 的数据", key); + return redisTemplate.opsForValue().get(key); + } + + @Override + public Boolean setData(@NotNull BusinessConstants businessConstants, String field, R value, Integer time) { + String key = RedisConstant.TYPE_AUTH + RedisConstant.TABLE_ROLE + businessConstants.getValue() + field; + log.info("\t\t> 写入 Redis 键为 {} 的数据", key); + redisTemplate.opsForValue().set(key, value); + redisTemplate.expire(key, time, TimeUnit.MINUTES); + return true; + } +} \ No newline at end of file