From 9c105a76302eecf478dffb269cb30e6d6dfb84b6 Mon Sep 17 00:00:00 2001 From: valarchie <343928303@qq.com> Date: Sun, 26 Feb 2023 22:29:48 +0800 Subject: [PATCH] =?UTF-8?q?feature:=20=E5=AE=9E=E6=97=B6=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/common/LoginController.java | 4 +- .../controller/system/SysRoleController.java | 5 +- .../src/main/resources/application.yml | 1 + .../agileboot/common/core/base/BaseUser.java | 1 + .../system/role/RoleApplicationService.java | 27 ++++----- .../system/user/UserApplicationService.java | 9 +-- .../domain/system/user/model/UserModel.java | 38 +++++++++++- .../system/user/model/UserModelFactory.java | 17 +++++- .../system/user/model/UserModelTest.java | 9 ++- .../infrastructure/cache/CacheCenter.java | 4 ++ .../cache/redis/CacheKeyEnum.java | 1 + .../cache/redis/RedisCacheService.java | 12 ++++ .../cache/redis/RedisCacheTemplate.java | 2 +- .../web/domain/login/LoginUser.java | 49 ++++++++------- .../web/domain/login/RoleInfo.java | 21 ++++++- .../web/service/LoginService.java | 3 +- .../web/service/MenuPermissionService.java | 8 +-- .../web/service/UserDetailsServiceImpl.java | 59 ++++++++++++++++--- .../CustomDataPermissionCheckerTest.java | 28 +++++---- .../DeptTreeDataPermissionCheckerTest.java | 24 +++++--- .../SingleDeptDataPermissionCheckerTest.java | 19 ++++-- .../orm/system/mapper/SysRoleMapper.java | 18 ++++++ .../orm/system/service/ISysRoleService.java | 9 +++ .../service/impl/SysRoleServiceImpl.java | 7 +++ 24 files changed, 280 insertions(+), 95 deletions(-) diff --git a/agileboot-admin/src/main/java/com/agileboot/admin/controller/common/LoginController.java b/agileboot-admin/src/main/java/com/agileboot/admin/controller/common/LoginController.java index 6d60e26..f64e230 100644 --- a/agileboot-admin/src/main/java/com/agileboot/admin/controller/common/LoginController.java +++ b/agileboot-admin/src/main/java/com/agileboot/admin/controller/common/LoginController.java @@ -12,6 +12,7 @@ import com.agileboot.domain.system.user.dto.UserDTO; import com.agileboot.infrastructure.annotations.RateLimit; import com.agileboot.infrastructure.annotations.RateLimit.CacheType; import com.agileboot.infrastructure.annotations.RateLimit.LimitType; +import com.agileboot.infrastructure.cache.CacheCenter; import com.agileboot.infrastructure.cache.map.MapCache; import com.agileboot.infrastructure.security.AuthenticationUtils; import com.agileboot.infrastructure.web.domain.login.CaptchaDTO; @@ -92,7 +93,8 @@ public class LoginController { LoginUser loginUser = AuthenticationUtils.getLoginUser(); UserPermissionDTO permissionDTO = new UserPermissionDTO(); - permissionDTO.setUser(new UserDTO(loginUser.getEntity())); + + permissionDTO.setUser(new UserDTO(CacheCenter.userCache.getObjectById(loginUser.getUserId()))); permissionDTO.setRoleKey(loginUser.getRoleInfo().getRoleKey()); permissionDTO.setPermissions(loginUser.getRoleInfo().getMenuPermissions()); permissionDTO.setDictTypes(MapCache.dictionaryCache()); diff --git a/agileboot-admin/src/main/java/com/agileboot/admin/controller/system/SysRoleController.java b/agileboot-admin/src/main/java/com/agileboot/admin/controller/system/SysRoleController.java index 7d046fa..44b1902 100644 --- a/agileboot-admin/src/main/java/com/agileboot/admin/controller/system/SysRoleController.java +++ b/agileboot-admin/src/main/java/com/agileboot/admin/controller/system/SysRoleController.java @@ -15,8 +15,6 @@ import com.agileboot.domain.system.role.query.RoleQuery; import com.agileboot.domain.system.role.query.UnallocatedRoleQuery; import com.agileboot.domain.system.user.dto.UserDTO; import com.agileboot.infrastructure.annotations.AccessLog; -import com.agileboot.infrastructure.security.AuthenticationUtils; -import com.agileboot.infrastructure.web.domain.login.LoginUser; import com.agileboot.orm.common.enums.BusinessTypeEnum; import java.util.List; import javax.servlet.http.HttpServletResponse; @@ -102,8 +100,7 @@ public class SysRoleController extends BaseController { @AccessLog(title = "角色管理", businessType = BusinessTypeEnum.MODIFY) @PutMapping public ResponseDTO edit(@Validated @RequestBody UpdateRoleCommand updateCommand) { - LoginUser loginUser = AuthenticationUtils.getLoginUser(); - roleApplicationService.updateRole(updateCommand, loginUser); + roleApplicationService.updateRole(updateCommand); return ResponseDTO.ok(); } diff --git a/agileboot-admin/src/main/resources/application.yml b/agileboot-admin/src/main/resources/application.yml index 8b76e65..4442fa9 100644 --- a/agileboot-admin/src/main/resources/application.yml +++ b/agileboot-admin/src/main/resources/application.yml @@ -24,6 +24,7 @@ spring: active: basic,dev # 如果需要无Mysql 无Redis直接启动的话 可以将这两个参数置为true, 并且spring.profile.active: dev换成test +# redis的端口可能会被占用,如果被占用请自己修改一下端口号 agileboot: embedded: mysql: false diff --git a/agileboot-common/src/main/java/com/agileboot/common/core/base/BaseUser.java b/agileboot-common/src/main/java/com/agileboot/common/core/base/BaseUser.java index a9bb772..d7347cd 100644 --- a/agileboot-common/src/main/java/com/agileboot/common/core/base/BaseUser.java +++ b/agileboot-common/src/main/java/com/agileboot/common/core/base/BaseUser.java @@ -5,6 +5,7 @@ import lombok.Data; /** * @author valarchie */ +@Deprecated @Data public class BaseUser { diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/system/role/RoleApplicationService.java b/agileboot-domain/src/main/java/com/agileboot/domain/system/role/RoleApplicationService.java index 77710c7..036ca07 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/system/role/RoleApplicationService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/system/role/RoleApplicationService.java @@ -15,9 +15,7 @@ import com.agileboot.domain.system.role.query.UnallocatedRoleQuery; import com.agileboot.domain.system.user.dto.UserDTO; import com.agileboot.domain.system.user.model.UserModel; import com.agileboot.domain.system.user.model.UserModelFactory; -import com.agileboot.infrastructure.web.domain.login.LoginUser; -import com.agileboot.infrastructure.web.service.TokenService; -import com.agileboot.infrastructure.web.service.UserDetailsServiceImpl; +import com.agileboot.infrastructure.cache.CacheCenter; import com.agileboot.orm.system.entity.SysRoleEntity; import com.agileboot.orm.system.entity.SysUserEntity; import com.agileboot.orm.system.service.ISysRoleService; @@ -49,11 +47,6 @@ public class RoleApplicationService { @NonNull private ISysUserService userService; - @NonNull - private TokenService tokenService; - - @NonNull - private UserDetailsServiceImpl userDetailsService; public PageDTO getRoleList(RoleQuery query) { Page page = roleService.page(query.toPage(), query.toQueryWrapper()); @@ -85,12 +78,14 @@ public class RoleApplicationService { roleModel.checkRoleCanBeDelete(); roleModel.deleteById(); + + CacheCenter.roleInfoCache.delete(roleModel.getRoleId()); } } } - public void updateRole(UpdateRoleCommand updateCommand, LoginUser loginUser) { + public void updateRole(UpdateRoleCommand updateCommand) { RoleModel roleModel = roleModelFactory.loadById(updateCommand.getRoleId()); roleModel.loadUpdateCommand(updateCommand); @@ -99,11 +94,7 @@ public class RoleApplicationService { roleModel.updateById(); - if (loginUser.isAdmin()) { - // TODO 如何实时刷新所有改动到的user的权限 - loginUser.getRoleInfo().setMenuPermissions(userDetailsService.getMenuPermissions(loginUser.getUserId())); - tokenService.setLoginUser(loginUser); - } + CacheCenter.roleInfoCache.delete(roleModel.getRoleId()); } public void updateStatus(UpdateStatusCommand command) { @@ -112,6 +103,8 @@ public class RoleApplicationService { roleModel.setStatus(command.getStatus()); roleModel.updateById(); + + CacheCenter.roleInfoCache.delete(roleModel.getRoleId()); } public void updateDataScope(UpdateDataScopeCommand command) { @@ -122,6 +115,8 @@ public class RoleApplicationService { roleModel.generateDeptIdSet(); roleModel.updateById(); + + CacheCenter.roleInfoCache.delete(roleModel.getRoleId()); } @@ -147,6 +142,8 @@ public class RoleApplicationService { updateWrapper.set(SysUserEntity::getRoleId, null).eq(SysUserEntity::getUserId, userId); userService.update(updateWrapper); + + CacheCenter.userCache.delete(userId); } } @@ -162,6 +159,8 @@ public class RoleApplicationService { UserModel user = userModelFactory.loadById(userId); user.setRoleId(roleId); user.updateById(); + + CacheCenter.userCache.delete(userId); } } diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/system/user/UserApplicationService.java b/agileboot-domain/src/main/java/com/agileboot/domain/system/user/UserApplicationService.java index ab03ae3..be90322 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/system/user/UserApplicationService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/system/user/UserApplicationService.java @@ -5,7 +5,6 @@ import com.agileboot.common.core.page.PageDTO; import com.agileboot.domain.common.command.BulkOperationCommand; import com.agileboot.domain.system.post.dto.PostDTO; import com.agileboot.domain.system.role.dto.RoleDTO; -import com.agileboot.domain.system.role.model.RoleModelFactory; import com.agileboot.domain.system.user.command.AddUserCommand; import com.agileboot.domain.system.user.command.ChangeStatusCommand; import com.agileboot.domain.system.user.command.ResetPasswordCommand; @@ -59,9 +58,6 @@ public class UserApplicationService { @NonNull private TokenService tokenService; - @NonNull - private RoleModelFactory roleModelFactory; - public PageDTO getUserList(SearchUserQuery query) { Page userPage = userService.getUserList(query); @@ -117,6 +113,7 @@ public class UserApplicationService { model.checkUsernameIsUnique(); model.checkPhoneNumberIsUnique(); model.checkEmailIsUnique(); + model.checkFieldRelatedEntityExist(); model.resetPassword(command.getPassword()); model.insert(); @@ -128,6 +125,7 @@ public class UserApplicationService { model.checkPhoneNumberIsUnique(); model.checkEmailIsUnique(); + model.checkFieldRelatedEntityExist(); model.updateById(); CacheCenter.userCache.delete(model.getUserId()); @@ -146,9 +144,6 @@ public class UserApplicationService { userModel.modifyPassword(command); userModel.updateById(); - loginUser.setEntity(userModel); - - tokenService.setLoginUser(loginUser); CacheCenter.userCache.delete(userModel.getUserId()); } diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/system/user/model/UserModel.java b/agileboot-domain/src/main/java/com/agileboot/domain/system/user/model/UserModel.java index 914396d..7c9a1bb 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/system/user/model/UserModel.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/system/user/model/UserModel.java @@ -6,6 +6,9 @@ import com.agileboot.common.config.AgileBootConfig; import com.agileboot.common.exception.ApiException; import com.agileboot.common.exception.error.ErrorCode; import com.agileboot.common.exception.error.ErrorCode.Business; +import com.agileboot.domain.system.dept.model.DeptModelFactory; +import com.agileboot.domain.system.post.model.PostModelFactory; +import com.agileboot.domain.system.role.model.RoleModelFactory; import com.agileboot.domain.system.user.command.AddUserCommand; import com.agileboot.domain.system.user.command.UpdateProfileCommand; import com.agileboot.domain.system.user.command.UpdateUserCommand; @@ -27,15 +30,27 @@ public class UserModel extends SysUserEntity { private ISysUserService userService; - public UserModel(SysUserEntity entity, ISysUserService userService) { + private PostModelFactory postModelFactory; + + private DeptModelFactory deptModelFactory; + + private RoleModelFactory roleModelFactory; + + public UserModel(SysUserEntity entity, ISysUserService userService, PostModelFactory postModelFactory, + DeptModelFactory deptModelFactory, RoleModelFactory roleModelFactory) { + this(userService, postModelFactory, deptModelFactory, roleModelFactory); + if (entity != null) { BeanUtil.copyProperties(entity, this); } - this.userService = userService; } - public UserModel(ISysUserService userService) { + public UserModel(ISysUserService userService, PostModelFactory postModelFactory, + DeptModelFactory deptModelFactory, RoleModelFactory roleModelFactory) { this.userService = userService; + this.postModelFactory = postModelFactory; + this.deptModelFactory = deptModelFactory; + this.roleModelFactory = roleModelFactory; } public void loadAddUserCommand(AddUserCommand command) { @@ -74,6 +89,23 @@ public class UserModel extends SysUserEntity { } } + public void checkFieldRelatedEntityExist() { + + if (getPostId() != null) { + postModelFactory.loadById(getPostId()); + } + + if (getDeptId() != null) { + deptModelFactory.loadById(getDeptId()); + } + + if (getRoleId() != null) { + roleModelFactory.loadById(getRoleId()); + } + + } + + public void checkEmailIsUnique() { if (StrUtil.isNotEmpty(getEmail()) && userService.isEmailDuplicated(getEmail(), getUserId())) { throw new ApiException(ErrorCode.Business.USER_EMAIL_IS_NOT_UNIQUE); diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/system/user/model/UserModelFactory.java b/agileboot-domain/src/main/java/com/agileboot/domain/system/user/model/UserModelFactory.java index 6a6ed4c..31b075b 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/system/user/model/UserModelFactory.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/system/user/model/UserModelFactory.java @@ -1,8 +1,10 @@ package com.agileboot.domain.system.user.model; -import cn.hutool.core.bean.BeanUtil; import com.agileboot.common.exception.ApiException; import com.agileboot.common.exception.error.ErrorCode; +import com.agileboot.domain.system.dept.model.DeptModelFactory; +import com.agileboot.domain.system.post.model.PostModelFactory; +import com.agileboot.domain.system.role.model.RoleModelFactory; import com.agileboot.orm.system.entity.SysUserEntity; import com.agileboot.orm.system.service.ISysUserService; import lombok.NonNull; @@ -20,16 +22,25 @@ public class UserModelFactory { @NonNull private ISysUserService userService; + @NonNull + private PostModelFactory postModelFactory; + + @NonNull + private DeptModelFactory deptModelFactory; + + @NonNull + private RoleModelFactory roleModelFactory; + public UserModel loadById(Long userId) { SysUserEntity byId = userService.getById(userId); if (byId == null) { throw new ApiException(ErrorCode.Business.OBJECT_NOT_FOUND, userId, "用户"); } - return new UserModel(byId, userService); + return new UserModel(byId, userService, postModelFactory, deptModelFactory, roleModelFactory); } public UserModel create() { - return new UserModel(userService); + return new UserModel(userService, postModelFactory, deptModelFactory, roleModelFactory); } } diff --git a/agileboot-domain/src/test/java/com/agileboot/domain/system/user/model/UserModelTest.java b/agileboot-domain/src/test/java/com/agileboot/domain/system/user/model/UserModelTest.java index 4f66d76..27a42ac 100644 --- a/agileboot-domain/src/test/java/com/agileboot/domain/system/user/model/UserModelTest.java +++ b/agileboot-domain/src/test/java/com/agileboot/domain/system/user/model/UserModelTest.java @@ -7,6 +7,9 @@ import static org.mockito.Mockito.when; import com.agileboot.common.exception.ApiException; import com.agileboot.common.exception.error.ErrorCode.Business; +import com.agileboot.domain.system.dept.model.DeptModelFactory; +import com.agileboot.domain.system.post.model.PostModelFactory; +import com.agileboot.domain.system.role.model.RoleModelFactory; import com.agileboot.domain.system.user.command.UpdateUserPasswordCommand; import com.agileboot.infrastructure.security.AuthenticationUtils; import com.agileboot.infrastructure.web.domain.login.LoginUser; @@ -17,8 +20,12 @@ import org.junit.jupiter.api.Test; class UserModelTest { private final ISysUserService userService = mock(ISysUserService.class); + private final PostModelFactory postModelFactory = mock(PostModelFactory.class); + private final DeptModelFactory deptModelFactory = mock(DeptModelFactory.class); + private final RoleModelFactory roleModelFactory = mock(RoleModelFactory.class); - private final UserModelFactory userModelFactory = new UserModelFactory(userService); + private final UserModelFactory userModelFactory = new UserModelFactory(userService, postModelFactory, + deptModelFactory, roleModelFactory); private static final long USER_ID = 1L; private static final long ADMIN_USER_ID = 1L; diff --git a/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/cache/CacheCenter.java b/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/cache/CacheCenter.java index fd76e89..b0435de 100644 --- a/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/cache/CacheCenter.java +++ b/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/cache/CacheCenter.java @@ -6,6 +6,7 @@ import com.agileboot.infrastructure.cache.guava.GuavaCacheService; import com.agileboot.infrastructure.cache.redis.RedisCacheService; import com.agileboot.infrastructure.cache.redis.RedisCacheTemplate; import com.agileboot.infrastructure.web.domain.login.LoginUser; +import com.agileboot.infrastructure.web.domain.login.RoleInfo; import com.agileboot.orm.system.entity.SysDeptEntity; import com.agileboot.orm.system.entity.SysUserEntity; import javax.annotation.PostConstruct; @@ -28,6 +29,8 @@ public class CacheCenter { public static RedisCacheTemplate userCache; + public static RedisCacheTemplate roleInfoCache; + @PostConstruct public void init() { GuavaCacheService guavaCache = SpringUtil.getBean(GuavaCacheService.class); @@ -39,6 +42,7 @@ public class CacheCenter { captchaCache = redisCache.captchaCache; loginUserCache = redisCache.loginUserCache; userCache = redisCache.userCache; + roleInfoCache = redisCache.roleInfoCache; } } diff --git a/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/cache/redis/CacheKeyEnum.java b/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/cache/redis/CacheKeyEnum.java index 6bc435d..7037856 100644 --- a/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/cache/redis/CacheKeyEnum.java +++ b/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/cache/redis/CacheKeyEnum.java @@ -14,6 +14,7 @@ public enum CacheKeyEnum { LOGIN_USER_KEY("login_tokens:", 30, TimeUnit.MINUTES), RATE_LIMIT_KEY("rate_limit:", 60, TimeUnit.SECONDS), USER_ENTITY_KEY("user_entity:", 60, TimeUnit.MINUTES), + ROLE_INFO_KEY("role_info:", 60, TimeUnit.MINUTES), ; diff --git a/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/cache/redis/RedisCacheService.java b/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/cache/redis/RedisCacheService.java index b181112..3835cf5 100644 --- a/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/cache/redis/RedisCacheService.java +++ b/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/cache/redis/RedisCacheService.java @@ -3,6 +3,8 @@ package com.agileboot.infrastructure.cache.redis; import cn.hutool.extra.spring.SpringUtil; import com.agileboot.infrastructure.cache.RedisUtil; import com.agileboot.infrastructure.web.domain.login.LoginUser; +import com.agileboot.infrastructure.web.domain.login.RoleInfo; +import com.agileboot.infrastructure.web.service.UserDetailsServiceImpl; import com.agileboot.orm.system.entity.SysUserEntity; import com.agileboot.orm.system.service.ISysUserService; import java.io.Serializable; @@ -24,6 +26,7 @@ public class RedisCacheService { public RedisCacheTemplate captchaCache; public RedisCacheTemplate loginUserCache; public RedisCacheTemplate userCache; + public RedisCacheTemplate roleInfoCache; @PostConstruct public void init() { @@ -40,6 +43,15 @@ public class RedisCacheService { } }; + roleInfoCache = new RedisCacheTemplate(redisUtil, CacheKeyEnum.ROLE_INFO_KEY) { + @Override + public RoleInfo getObjectFromDb(Object id) { + UserDetailsServiceImpl userDetailsService = SpringUtil.getBean(UserDetailsServiceImpl.class); + return userDetailsService.getRoleInfo((Long) id); + } + + }; + } diff --git a/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/cache/redis/RedisCacheTemplate.java b/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/cache/redis/RedisCacheTemplate.java index 2071c71..c602ade 100644 --- a/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/cache/redis/RedisCacheTemplate.java +++ b/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/cache/redis/RedisCacheTemplate.java @@ -54,7 +54,7 @@ public class RedisCacheTemplate { String cachedKey = generateKey(id); try { Optional optional = guavaCache.get(cachedKey); - log.debug("find the guava cache of key: {}", cachedKey); +// log.debug("find the guava cache of key: {}", cachedKey); if (!optional.isPresent()) { T objectFromDb = getObjectFromDb(id); diff --git a/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/web/domain/login/LoginUser.java b/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/web/domain/login/LoginUser.java index e08708e..605c1e9 100644 --- a/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/web/domain/login/LoginUser.java +++ b/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/web/domain/login/LoginUser.java @@ -1,7 +1,6 @@ package com.agileboot.infrastructure.web.domain.login; -import com.agileboot.common.core.base.BaseUser; -import com.agileboot.orm.system.entity.SysUserEntity; +import com.agileboot.infrastructure.cache.CacheCenter; import com.fasterxml.jackson.annotation.JsonIgnore; import java.util.Collection; import lombok.Data; @@ -15,9 +14,11 @@ import org.springframework.security.core.userdetails.UserDetails; */ @Data @NoArgsConstructor -public class LoginUser extends BaseUser implements UserDetails { +public class LoginUser implements UserDetails { private static final long serialVersionUID = 1L; + + private Long userId; /** * 用户唯一标识 */ @@ -38,29 +39,37 @@ public class LoginUser extends BaseUser implements UserDetails { */ private LoginInfo loginInfo = new LoginInfo(); - /** - * 角色信息 - */ - private RoleInfo roleInfo = new RoleInfo(); - private SysUserEntity entity; - - - public LoginUser(SysUserEntity entity, RoleInfo roleInfo) { - setUsername(entity.getUsername()); - setUserId(entity.getUserId()); - setDeptId(entity.getDeptId()); - setRoleId(entity.getRoleId()); - if (roleInfo != null) { - this.roleInfo = roleInfo; - } - this.entity = entity; + public LoginUser(Long userId) { + this.userId = userId; } + public RoleInfo getRoleInfo() { + return CacheCenter.roleInfoCache.getObjectById(getRoleId()); + } + + public Long getRoleId() { + if (isAdmin()) { + return RoleInfo.ADMIN_ROLE_ID; + } else { + return CacheCenter.userCache.getObjectById(userId).getRoleId(); + } + } + + public Long getDeptId() { + return CacheCenter.userCache.getObjectById(userId).getDeptId(); + } + + @Override + public String getUsername() { + return CacheCenter.userCache.getObjectById(userId).getUsername(); + } + + @JsonIgnore @Override public String getPassword() { - return entity.getPassword(); + return CacheCenter.userCache.getObjectById(userId).getPassword(); } diff --git a/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/web/domain/login/RoleInfo.java b/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/web/domain/login/RoleInfo.java index cae8183..f668097 100644 --- a/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/web/domain/login/RoleInfo.java +++ b/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/web/domain/login/RoleInfo.java @@ -20,6 +20,26 @@ import org.apache.commons.collections4.SetUtils; @NoArgsConstructor public class RoleInfo { + public static final RoleInfo EMPTY_ROLE = new RoleInfo(); + public static final long ADMIN_ROLE_ID = -1; + public static final String ADMIN_ROLE_KEY = "admin"; + public static final String ALL_PERMISSIONS = "*:*:*"; + + public static final Set ADMIN_PERMISSIONS = SetUtils.hashSet(ALL_PERMISSIONS); + + + public RoleInfo(Long roleId, String roleKey, DataScopeEnum dataScope, Set deptIdSet, + Set menuPermissions, Set menuIds) { + this.roleId = roleId; + this.roleKey = roleKey; + this.dataScope = dataScope; + this.deptIdSet = deptIdSet; + this.menuPermissions = menuPermissions != null ? menuPermissions : SetUtils.emptySet(); + this.menuIds = menuIds != null ? menuIds : SetUtils.emptySet(); + } + + + @Deprecated public RoleInfo(SysRoleEntity entity, String roleKey, Set menuPermissions, Set menuIds) { if (entity != null) { this.roleId = entity.getRoleId(); @@ -34,7 +54,6 @@ public class RoleInfo { this.roleKey = roleKey; this.menuPermissions = menuPermissions != null ? menuPermissions : SetUtils.emptySet(); this.menuIds = menuIds != null ? menuIds : SetUtils.emptySet(); - } } diff --git a/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/web/service/LoginService.java b/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/web/service/LoginService.java index 8e2558d..a75cfca 100644 --- a/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/web/service/LoginService.java +++ b/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/web/service/LoginService.java @@ -98,7 +98,8 @@ public class LoginService { ThreadPoolManager.execute(AsyncTaskFactory.loginInfoTask(loginDTO.getUsername(), LoginStatusEnum.LOGIN_SUCCESS, LoginStatusEnum.LOGIN_SUCCESS.description())); LoginUser loginUser = (LoginUser) authentication.getPrincipal(); - recordLoginInfo(loginUser.getEntity()); + SysUserEntity userEntity = CacheCenter.userCache.getObjectById(loginUser.getUserId()); + recordLoginInfo(userEntity); // 生成token return tokenService.createToken(loginUser); } diff --git a/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/web/service/MenuPermissionService.java b/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/web/service/MenuPermissionService.java index 40e7fec..c2971bf 100644 --- a/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/web/service/MenuPermissionService.java +++ b/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/web/service/MenuPermissionService.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.agileboot.infrastructure.security.AuthenticationUtils; import com.agileboot.infrastructure.web.domain.login.LoginUser; +import com.agileboot.infrastructure.web.domain.login.RoleInfo; import java.util.Set; import org.springframework.stereotype.Service; @@ -14,11 +15,6 @@ import org.springframework.stereotype.Service; @Service("permission") public class MenuPermissionService { - /** - * 所有权限标识 - */ - private static final String ALL_PERMISSION = "*:*:*"; - /** * 验证用户是否具备某权限 @@ -46,7 +42,7 @@ public class MenuPermissionService { * @return 用户是否具备某权限 */ private boolean has(Set permissions, String permission) { - return permissions.contains(ALL_PERMISSION) || permissions.contains(StrUtil.trim(permission)); + return permissions.contains(RoleInfo.ALL_PERMISSIONS) || permissions.contains(StrUtil.trim(permission)); } } diff --git a/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/web/service/UserDetailsServiceImpl.java b/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/web/service/UserDetailsServiceImpl.java index 126193b..912a675 100644 --- a/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/web/service/UserDetailsServiceImpl.java +++ b/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/web/service/UserDetailsServiceImpl.java @@ -1,16 +1,21 @@ package com.agileboot.infrastructure.web.service; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; import com.agileboot.common.exception.ApiException; import com.agileboot.common.exception.error.ErrorCode; import com.agileboot.infrastructure.web.domain.login.LoginUser; import com.agileboot.infrastructure.web.domain.login.RoleInfo; +import com.agileboot.orm.common.enums.DataScopeEnum; import com.agileboot.orm.common.enums.UserStatusEnum; +import com.agileboot.orm.common.util.BasicEnumUtil; import com.agileboot.orm.system.entity.SysMenuEntity; import com.agileboot.orm.system.entity.SysRoleEntity; import com.agileboot.orm.system.entity.SysRoleMenuEntity; import com.agileboot.orm.system.entity.SysUserEntity; import com.agileboot.orm.system.service.ISysMenuService; import com.agileboot.orm.system.service.ISysRoleMenuService; +import com.agileboot.orm.system.service.ISysRoleService; import com.agileboot.orm.system.service.ISysUserService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -22,6 +27,7 @@ import java.util.stream.Collectors; import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.SetUtils; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; @@ -48,6 +54,9 @@ public class UserDetailsServiceImpl implements UserDetailsService { @NonNull private ISysMenuService menuService; + @NonNull + private ISysRoleService roleService; + @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { @@ -61,17 +70,49 @@ public class UserDetailsServiceImpl implements UserDetailsService { throw new ApiException(ErrorCode.Business.USER_IS_DISABLE, username); } - SysRoleEntity roleEntity = userService.getRoleOfUser(userEntity.getUserId()); - RoleInfo roleInfo = new RoleInfo( - roleEntity, - getRoleKey(userEntity.getUserId()), - getMenuPermissions(userEntity.getUserId()), - getMenuIds(userEntity.getUserId(), userEntity.getRoleId()) - ); - - return new LoginUser(userEntity, roleInfo); + return new LoginUser(userEntity.getUserId()); } + public RoleInfo getRoleInfo(Long roleId) { + if (roleId == null) { + return RoleInfo.EMPTY_ROLE; + } + + if (roleId == RoleInfo.ADMIN_ROLE_ID) { + LambdaQueryWrapper menuQuery = Wrappers.lambdaQuery(); + menuQuery.select(SysMenuEntity::getMenuId); + List allMenus = menuService.list(menuQuery); + + Set allMenuIds = allMenus.stream().map(SysMenuEntity::getMenuId).collect(Collectors.toSet()); + + return new RoleInfo(RoleInfo.ADMIN_ROLE_ID, RoleInfo.ADMIN_ROLE_KEY, DataScopeEnum.ALL, SetUtils.emptySet(), + RoleInfo.ADMIN_PERMISSIONS, allMenuIds); + + } + + SysRoleEntity roleEntity = roleService.getById(roleId); + + if (roleEntity == null) { + return RoleInfo.EMPTY_ROLE; + } + + List menuList = roleService.getMenuListByRoleId(roleId); + + Set menuIds = menuList.stream().map(SysMenuEntity::getMenuId).collect(Collectors.toSet()); + Set permissions = menuList.stream().map(SysMenuEntity::getPerms).collect(Collectors.toSet()); + + DataScopeEnum dataScopeEnum = BasicEnumUtil.fromValue(DataScopeEnum.class, roleEntity.getDataScope()); + + Set deptIdSet = SetUtils.emptySet(); + if (StrUtil.isNotEmpty(roleEntity.getDeptIdSet())) { + deptIdSet = StrUtil.split(roleEntity.getDeptIdSet(), ",").stream() + .map(Convert::toLong).collect(Collectors.toSet()); + } + + return new RoleInfo(roleId, roleEntity.getRoleKey(), dataScopeEnum, deptIdSet, permissions, menuIds); + } + + /** * 获取角色数据权限 * @param userId 用户信息 diff --git a/agileboot-infrastructure/src/test/java/com/agileboot/infrastructure/web/domain/permission/checker/CustomDataPermissionCheckerTest.java b/agileboot-infrastructure/src/test/java/com/agileboot/infrastructure/web/domain/permission/checker/CustomDataPermissionCheckerTest.java index 2287143..2154989 100644 --- a/agileboot-infrastructure/src/test/java/com/agileboot/infrastructure/web/domain/permission/checker/CustomDataPermissionCheckerTest.java +++ b/agileboot-infrastructure/src/test/java/com/agileboot/infrastructure/web/domain/permission/checker/CustomDataPermissionCheckerTest.java @@ -1,25 +1,34 @@ package com.agileboot.infrastructure.web.domain.permission.checker; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import com.agileboot.infrastructure.web.domain.login.LoginUser; import com.agileboot.infrastructure.web.domain.login.RoleInfo; import com.agileboot.infrastructure.web.domain.permission.DataCondition; import com.agileboot.orm.system.service.ISysDeptService; import org.apache.commons.collections4.SetUtils; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; class CustomDataPermissionCheckerTest { private final ISysDeptService deptService = mock(ISysDeptService.class); + public LoginUser loginUser = mock(LoginUser.class); + + @BeforeEach + public void mockBefore() { + when(loginUser.getRoleInfo()).thenReturn(RoleInfo.EMPTY_ROLE); + } @Test void testCheckWhenParameterNull() { CustomDataPermissionChecker customChecker = new CustomDataPermissionChecker(deptService); boolean check1 = customChecker.check(null, null); - boolean check2 = customChecker.check(new LoginUser(), null); + boolean check2 = customChecker.check(loginUser, null); boolean check3 = customChecker.check(null, new DataCondition()); assertFalse(check1); @@ -31,7 +40,7 @@ class CustomDataPermissionCheckerTest { void testCheckWhenTargetDeptIdNull() { CustomDataPermissionChecker customChecker = new CustomDataPermissionChecker(deptService); - boolean check = customChecker.check(new LoginUser(), new DataCondition(null, 1L)); + boolean check = customChecker.check(loginUser, new DataCondition(null, 1L)); assertFalse(check); } @@ -41,7 +50,8 @@ class CustomDataPermissionCheckerTest { void testCheckWhenRoleIsNull() { CustomDataPermissionChecker customChecker = new CustomDataPermissionChecker(deptService); - boolean check = customChecker.check(new LoginUser(), new DataCondition(1L, 1L)); + when(loginUser.getRoleInfo()).thenReturn(null); + boolean check = customChecker.check(loginUser, new DataCondition(1L, 1L)); assertFalse(check); } @@ -51,10 +61,8 @@ class CustomDataPermissionCheckerTest { void testCheckWhenNotContainTargetDeptId() { CustomDataPermissionChecker customChecker = new CustomDataPermissionChecker(deptService); - LoginUser loginUser = new LoginUser(); - loginUser.setRoleInfo(new RoleInfo()); loginUser.getRoleInfo().setDeptIdSet(SetUtils.hashSet(2L)); - boolean check = customChecker.check(new LoginUser(), new DataCondition(1L, 1L)); + boolean check = customChecker.check(loginUser, new DataCondition(1L, 1L)); assertFalse(check); } @@ -63,13 +71,11 @@ class CustomDataPermissionCheckerTest { @Test void testCheckWhenContainTargetDeptId() { CustomDataPermissionChecker customChecker = new CustomDataPermissionChecker(deptService); - LoginUser loginUser = new LoginUser(); - loginUser.setRoleInfo(new RoleInfo()); + loginUser.getRoleInfo().setDeptIdSet(SetUtils.hashSet(1L)); + boolean check = customChecker.check(loginUser, new DataCondition(1L, 1L)); - boolean check = customChecker.check(new LoginUser(), new DataCondition(1L, 1L)); - - assertFalse(check); + assertTrue(check); } diff --git a/agileboot-infrastructure/src/test/java/com/agileboot/infrastructure/web/domain/permission/checker/DeptTreeDataPermissionCheckerTest.java b/agileboot-infrastructure/src/test/java/com/agileboot/infrastructure/web/domain/permission/checker/DeptTreeDataPermissionCheckerTest.java index a5cb159..72624e0 100644 --- a/agileboot-infrastructure/src/test/java/com/agileboot/infrastructure/web/domain/permission/checker/DeptTreeDataPermissionCheckerTest.java +++ b/agileboot-infrastructure/src/test/java/com/agileboot/infrastructure/web/domain/permission/checker/DeptTreeDataPermissionCheckerTest.java @@ -4,10 +4,13 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import com.agileboot.infrastructure.web.domain.login.LoginUser; +import com.agileboot.infrastructure.web.domain.login.RoleInfo; import com.agileboot.infrastructure.web.domain.permission.DataCondition; import com.agileboot.orm.system.service.ISysDeptService; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; @@ -15,6 +18,13 @@ class DeptTreeDataPermissionCheckerTest { private final ISysDeptService deptService = mock(ISysDeptService.class); + public LoginUser loginUser = mock(LoginUser.class); + + @BeforeEach + public void mockBefore() { + when(loginUser.getRoleInfo()).thenReturn(RoleInfo.EMPTY_ROLE); + } + @Test void testCheckWhenParameterNull() { DeptTreeDataPermissionChecker checker = new DeptTreeDataPermissionChecker(deptService); @@ -22,7 +32,7 @@ class DeptTreeDataPermissionCheckerTest { boolean check1 = checker.check(null, null); boolean check2 = checker.check(new LoginUser(), null); boolean check3 = checker.check(null, new DataCondition()); - boolean check4 = checker.check(new LoginUser(), new DataCondition()); + boolean check4 = checker.check(loginUser, new DataCondition()); assertFalse(check1); assertFalse(check2); @@ -35,9 +45,9 @@ class DeptTreeDataPermissionCheckerTest { void testCheckWhenIsChildOfDept() { DeptTreeDataPermissionChecker checker = new DeptTreeDataPermissionChecker(deptService); - Mockito.when(deptService.isChildOfTheDept(any(), any())).thenReturn(true); - LoginUser loginUser = new LoginUser(); - loginUser.setDeptId(1L); + when(deptService.isChildOfTheDept(any(), any())).thenReturn(true); + when(loginUser.getDeptId()).thenReturn(1L); + DataCondition dataCondition = new DataCondition(); dataCondition.setTargetDeptId(2L); @@ -52,8 +62,7 @@ class DeptTreeDataPermissionCheckerTest { DeptTreeDataPermissionChecker checker = new DeptTreeDataPermissionChecker(deptService); Mockito.when(deptService.isChildOfTheDept(any(), any())).thenReturn(false); - LoginUser loginUser = new LoginUser(); - loginUser.setDeptId(1L); + when(loginUser.getDeptId()).thenReturn(1L); DataCondition dataCondition = new DataCondition(); dataCondition.setTargetDeptId(1L); @@ -68,8 +77,7 @@ class DeptTreeDataPermissionCheckerTest { DeptTreeDataPermissionChecker checker = new DeptTreeDataPermissionChecker(deptService); Mockito.when(deptService.isChildOfTheDept(any(), any())).thenReturn(false); - LoginUser loginUser = new LoginUser(); - loginUser.setDeptId(1L); + when(loginUser.getDeptId()).thenReturn(1L); DataCondition dataCondition = new DataCondition(); dataCondition.setTargetDeptId(2L); diff --git a/agileboot-infrastructure/src/test/java/com/agileboot/infrastructure/web/domain/permission/checker/SingleDeptDataPermissionCheckerTest.java b/agileboot-infrastructure/src/test/java/com/agileboot/infrastructure/web/domain/permission/checker/SingleDeptDataPermissionCheckerTest.java index 8b2efd7..b4c765c 100644 --- a/agileboot-infrastructure/src/test/java/com/agileboot/infrastructure/web/domain/permission/checker/SingleDeptDataPermissionCheckerTest.java +++ b/agileboot-infrastructure/src/test/java/com/agileboot/infrastructure/web/domain/permission/checker/SingleDeptDataPermissionCheckerTest.java @@ -3,16 +3,27 @@ package com.agileboot.infrastructure.web.domain.permission.checker; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import com.agileboot.infrastructure.web.domain.login.LoginUser; +import com.agileboot.infrastructure.web.domain.login.RoleInfo; import com.agileboot.infrastructure.web.domain.permission.DataCondition; import com.agileboot.orm.system.service.ISysDeptService; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; class SingleDeptDataPermissionCheckerTest { private final ISysDeptService deptService = mock(ISysDeptService.class); + public LoginUser loginUser = mock(LoginUser.class); + + @BeforeEach + public void mockBefore() { + when(loginUser.getRoleInfo()).thenReturn(RoleInfo.EMPTY_ROLE); + } + + @Test void testCheckWhenParameterNull() { SingleDeptDataPermissionChecker checker = new SingleDeptDataPermissionChecker(deptService); @@ -20,7 +31,7 @@ class SingleDeptDataPermissionCheckerTest { boolean check1 = checker.check(null, null); boolean check2 = checker.check(new LoginUser(), null); boolean check3 = checker.check(null, new DataCondition()); - boolean check4 = checker.check(new LoginUser(), new DataCondition()); + boolean check4 = checker.check(loginUser, new DataCondition()); assertFalse(check1); assertFalse(check2); @@ -31,8 +42,7 @@ class SingleDeptDataPermissionCheckerTest { @Test void testCheckWhenSameDeptId() { SingleDeptDataPermissionChecker checker = new SingleDeptDataPermissionChecker(deptService); - LoginUser loginUser = new LoginUser(); - loginUser.setDeptId(1L); + when(loginUser.getDeptId()).thenReturn(1L); DataCondition dataCondition = new DataCondition(); dataCondition.setTargetDeptId(1L); @@ -45,8 +55,7 @@ class SingleDeptDataPermissionCheckerTest { @Test void testCheckWhenDifferentDeptId() { SingleDeptDataPermissionChecker checker = new SingleDeptDataPermissionChecker(deptService); - LoginUser loginUser = new LoginUser(); - loginUser.setDeptId(1L); + when(loginUser.getDeptId()).thenReturn(1L); DataCondition dataCondition = new DataCondition(); dataCondition.setTargetUserId(2L); diff --git a/agileboot-orm/src/main/java/com/agileboot/orm/system/mapper/SysRoleMapper.java b/agileboot-orm/src/main/java/com/agileboot/orm/system/mapper/SysRoleMapper.java index 3293c70..215c8f7 100644 --- a/agileboot-orm/src/main/java/com/agileboot/orm/system/mapper/SysRoleMapper.java +++ b/agileboot-orm/src/main/java/com/agileboot/orm/system/mapper/SysRoleMapper.java @@ -1,7 +1,10 @@ package com.agileboot.orm.system.mapper; +import com.agileboot.orm.system.entity.SysMenuEntity; import com.agileboot.orm.system.entity.SysRoleEntity; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; +import org.apache.ibatis.annotations.Select; /** *

@@ -13,4 +16,19 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface SysRoleMapper extends BaseMapper { + /** + * 根据角色ID查询对应的菜单权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + @Select("SELECT m.* " + + "FROM sys_menu m " + + " LEFT JOIN sys_role_menu rm ON m.menu_id = rm.menu_id " + + " LEFT JOIN sys_role r ON r.role_id = rm.role_id " + + "WHERE m.status = 1 AND m.deleted = 0 " + + " AND r.status = 1 AND r.deleted = 0 " + + " AND r.role_id = #{roleId}") + List getMenuListByRoleId(Long roleId); + } diff --git a/agileboot-orm/src/main/java/com/agileboot/orm/system/service/ISysRoleService.java b/agileboot-orm/src/main/java/com/agileboot/orm/system/service/ISysRoleService.java index 6fc4a6a..c381eaa 100644 --- a/agileboot-orm/src/main/java/com/agileboot/orm/system/service/ISysRoleService.java +++ b/agileboot-orm/src/main/java/com/agileboot/orm/system/service/ISysRoleService.java @@ -1,7 +1,9 @@ package com.agileboot.orm.system.service; +import com.agileboot.orm.system.entity.SysMenuEntity; import com.agileboot.orm.system.entity.SysRoleEntity; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; /** *

@@ -38,5 +40,12 @@ public interface ISysRoleService extends IService { */ boolean isAssignedToUsers(Long roleId); + /** + * 获取用户的权限列表 + * @param roleId + * @return + */ + List getMenuListByRoleId(Long roleId); + } diff --git a/agileboot-orm/src/main/java/com/agileboot/orm/system/service/impl/SysRoleServiceImpl.java b/agileboot-orm/src/main/java/com/agileboot/orm/system/service/impl/SysRoleServiceImpl.java index a27f842..1a5355c 100644 --- a/agileboot-orm/src/main/java/com/agileboot/orm/system/service/impl/SysRoleServiceImpl.java +++ b/agileboot-orm/src/main/java/com/agileboot/orm/system/service/impl/SysRoleServiceImpl.java @@ -1,5 +1,6 @@ package com.agileboot.orm.system.service.impl; +import com.agileboot.orm.system.entity.SysMenuEntity; import com.agileboot.orm.system.entity.SysRoleEntity; import com.agileboot.orm.system.entity.SysUserEntity; import com.agileboot.orm.system.mapper.SysRoleMapper; @@ -7,6 +8,7 @@ import com.agileboot.orm.system.mapper.SysUserMapper; import com.agileboot.orm.system.service.ISysRoleService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; import lombok.NonNull; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -49,5 +51,10 @@ public class SysRoleServiceImpl extends ServiceImpl getMenuListByRoleId(Long roleId) { + return baseMapper.getMenuListByRoleId(roleId); + } + }