From ba80cebc454c8de75d575e2fa16ef12ad7ccffdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=BE=E6=96=87=E8=B1=AA?= <980287353@qq.com> Date: Wed, 7 Aug 2024 22:15:40 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E6=8F=90=E4=BA=A4=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E6=8E=88=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...tyAspect.java => RoleAuthorityAspect.java} | 11 +- .../role/controller/RoleController.java | 13 +- .../role/service/CoreRoleService.java | 148 ++++++++---------- .../role/service/RoleAuthorityHandler.java | 100 ++++++++++++ .../tiesheng/util/service/TsCacheService.java | 13 ++ .../util/service/cache/TsCacheHandler.java | 4 + .../service/cache/TsCacheRedisHandler.java | 7 + .../service/cache/TsCacheTimedHandler.java | 10 ++ .../util/service/role/TsAuthorityHandler.java | 31 ++++ 9 files changed, 242 insertions(+), 95 deletions(-) rename springboot-role/src/main/java/com/tiesheng/role/config/{HasAuthorityAspect.java => RoleAuthorityAspect.java} (87%) create mode 100644 springboot-role/src/main/java/com/tiesheng/role/service/RoleAuthorityHandler.java create mode 100644 springboot-util/src/main/java/com/tiesheng/util/service/role/TsAuthorityHandler.java diff --git a/springboot-role/src/main/java/com/tiesheng/role/config/HasAuthorityAspect.java b/springboot-role/src/main/java/com/tiesheng/role/config/RoleAuthorityAspect.java similarity index 87% rename from springboot-role/src/main/java/com/tiesheng/role/config/HasAuthorityAspect.java rename to springboot-role/src/main/java/com/tiesheng/role/config/RoleAuthorityAspect.java index 8158286..ecdfa6b 100644 --- a/springboot-role/src/main/java/com/tiesheng/role/config/HasAuthorityAspect.java +++ b/springboot-role/src/main/java/com/tiesheng/role/config/RoleAuthorityAspect.java @@ -10,6 +10,7 @@ import com.tiesheng.util.config.TsTokenConfig; import com.tiesheng.util.exception.ApiException; import com.tiesheng.util.pojos.TokenBean; import com.tiesheng.util.service.TsCacheService; +import com.tiesheng.util.service.role.TsAuthorityHandler; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @@ -23,14 +24,14 @@ import java.util.stream.Collectors; @Aspect @Component -public class HasAuthorityAspect { +public class RoleAuthorityAspect { public static final String CACHE_HAS_AUTHORITY = "CACHE:HAS_AUTHORITY:{}"; - @Resource - CoreRoleUserMapper coreRoleUserMapper; @Resource TsTokenConfig tsTokenConfig; + @Resource + TsAuthorityHandler tsAuthorityHandler; /** @@ -57,9 +58,7 @@ public class HasAuthorityAspect { .stream().filter(StrUtil::isNotEmpty).collect(Collectors.toList()); if (CollUtil.isEmpty(authorityList)) { - List list = coreRoleUserMapper.getOwnerAuthorityLeafList(tokenBean.getId(), - tokenBean.getRoleId()); - authorityList = list.stream().map(CoreRoleAuthority::getNo).collect(Collectors.toList()); + authorityList = tsAuthorityHandler.getAuthorities(tokenBean); if (CollUtil.isNotEmpty(authorityList)) { TsCacheService.of().put(cacheKey, StrUtil.join(";", authorityList)); } diff --git a/springboot-role/src/main/java/com/tiesheng/role/controller/RoleController.java b/springboot-role/src/main/java/com/tiesheng/role/controller/RoleController.java index 79fdc5f..e7c9b5d 100644 --- a/springboot-role/src/main/java/com/tiesheng/role/controller/RoleController.java +++ b/springboot-role/src/main/java/com/tiesheng/role/controller/RoleController.java @@ -117,7 +117,7 @@ public class RoleController { /** - * 橘色的权限编辑 + * 角色的权限编辑 * * @return */ @@ -158,11 +158,7 @@ public class RoleController { @PostMapping("/user/update") @RoleAuthority(value = "userUpdate") public ApiResp userUpdate(@RequestBody CoreRoleUser roleUser) { - if (StrUtil.isNotEmpty(roleUser.getId())) { - coreRoleService.getUserMapper().updateById(roleUser); - } else { - coreRoleService.getUserMapper().insert(roleUser); - } + coreRoleService.roleUserUpdate(roleUser); return ApiResp.respOK(""); } @@ -175,10 +171,7 @@ public class RoleController { @PostMapping("/user/deleted") @RoleAuthority(value = "userDeleted") public ApiResp userDeleted(@RequestBody @Valid IdDTO dto) { - CoreRoleUser coreRoleUser = new CoreRoleUser(); - coreRoleUser.setId(dto.getId()); - coreRoleUser.setIsDeleted(1); - coreRoleService.getUserMapper().updateById(coreRoleUser); + coreRoleService.roleUserDeleted(dto.getId()); return ApiResp.respOK(""); } diff --git a/springboot-role/src/main/java/com/tiesheng/role/service/CoreRoleService.java b/springboot-role/src/main/java/com/tiesheng/role/service/CoreRoleService.java index ec00934..a6ed998 100644 --- a/springboot-role/src/main/java/com/tiesheng/role/service/CoreRoleService.java +++ b/springboot-role/src/main/java/com/tiesheng/role/service/CoreRoleService.java @@ -3,18 +3,23 @@ package com.tiesheng.role.service; import cn.hutool.core.annotation.AnnotationUtil; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Validator; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.tiesheng.annotation.role.RoleAuthority; +import com.tiesheng.role.config.RoleAuthorityAspect; import com.tiesheng.role.mapper.*; import com.tiesheng.role.pojos.dao.CoreRoleAuthority; import com.tiesheng.role.pojos.dao.CoreRoleGroup; import com.tiesheng.role.pojos.dao.CoreRoleGroupRx; +import com.tiesheng.role.pojos.dao.CoreRoleUser; import com.tiesheng.role.pojos.dto.GroupRxUpdateDTO; import com.tiesheng.role.pojos.dto.OwnerMenuDTO; import com.tiesheng.role.pojos.vo.ServiceMenuVO; -import com.tiesheng.util.config.GlobalConfig; +import com.tiesheng.util.exception.ApiException; +import com.tiesheng.util.service.TsCacheService; import com.tiesheng.util.service.TsServiceBase; +import com.tiesheng.util.service.role.TsAuthorityHandler; import org.springframework.aop.support.AopUtils; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationListener; @@ -24,10 +29,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; @Service @@ -43,7 +45,7 @@ public class CoreRoleService extends TsServiceBase() .eq("group_id", dto.getId()) ); + + CoreRoleGroup roleGroup = getById(dto.getId()); + Validator.validateNotEmpty(roleGroup, "角色不存在"); + + List authorities = coreRoleAuthorityMapper.selectList(new QueryWrapper() + .eq(CoreRoleAuthority.IS_DELETED, 0) + .in("id", dto.getMenuIds()) + ); + List list = new ArrayList<>(); - for (String menuId : dto.getMenuIds()) { + for (CoreRoleAuthority authority : authorities) { CoreRoleGroupRx coreRoleGroupRx = new CoreRoleGroupRx(); - coreRoleGroupRx.setGroupId(dto.getId()); - coreRoleGroupRx.setMenuId(menuId); + coreRoleGroupRx.setGroupId(roleGroup.getId()); + coreRoleGroupRx.setMenuId(authority.getId()); list.add(coreRoleGroupRx); } if (CollUtil.isNotEmpty(list)) { coreRoleGroupRxMapper.batchInsert(list); + onRoleChange(dto.getId(), ""); + } + + } + + + /** + * 编辑、更新用户的授权 + * + * @param roleUser + */ + public void roleUserUpdate(CoreRoleUser roleUser) { + if (StrUtil.isNotEmpty(roleUser.getId())) { + coreRoleUserMapper.updateById(roleUser); + } else { + coreRoleUserMapper.insert(roleUser); + } + + onRoleChange(roleUser.getTypeId(), roleUser.getUserId()); + } + + + /** + * 删除用户授权 + * + * @param recordId + */ + public void roleUserDeleted(String recordId) { + CoreRoleUser coreRoleUser = coreRoleUserMapper.selectById(recordId); + if (coreRoleUser == null || coreRoleUser.getIsDeleted() == 1) { + throw new ApiException("该授权已被删除"); + } + coreRoleUser.setIsDeleted(1); + coreRoleUserMapper.updateById(coreRoleUser); + + onRoleChange(coreRoleUser.getTypeId(), coreRoleUser.getUserId()); + } + + + /** + * 当授权发生变化时 + */ + public void onRoleChange(String roleId, String userId) { + if (StrUtil.isNotEmpty(userId)) { + TsCacheService.of().remove(StrUtil.format(RoleAuthorityAspect.CACHE_HAS_AUTHORITY, userId)); + } else { + TsCacheService.of().keys(StrUtil.replace(RoleAuthorityAspect.CACHE_HAS_AUTHORITY, + "{}", "")).forEach(key -> TsCacheService.of().remove(key)); } } @@ -180,78 +239,9 @@ public class CoreRoleService extends TsServiceBase points) { - if (menu.group().length == 0 || CollUtil.isEmpty(points)) { - return; + tsAuthorityHandler.addRoleAuthority(menu, points); } - - List list = new ArrayList<>(); - - // 分组 - CoreRoleAuthority groupAuthority = new CoreRoleAuthority(); - groupAuthority.setLevel(0); - for (String group : menu.group()) { - - String parentId = groupAuthority.getParent(); - int level = groupAuthority.getLevel() + 1; - String no = group; - if (StrUtil.isNotEmpty(groupAuthority.getNo())) { - no = StrUtil.join("_", groupAuthority.getNo(), group); - } - - groupAuthority = new CoreRoleAuthority(); - groupAuthority.setNo(no); - groupAuthority.setName(group); - groupAuthority.setService(globalConfig.getService()); - groupAuthority.setType("group"); - groupAuthority.setLevel(level); - groupAuthority.setPlatform(menu.platform()); - groupAuthority.setParent(parentId); - groupAuthority.setId(StrUtil.join("_", groupAuthority.getService(), groupAuthority.getNo())); - list.add(groupAuthority); - } - - - // 菜单 - CoreRoleAuthority menuAuthority = new CoreRoleAuthority(); - menuAuthority.setNo(StrUtil.join("_", menu.group(), menu.value())); - menuAuthority.setName(menu.value()); - menuAuthority.setService(globalConfig.getService()); - menuAuthority.setType("menu"); - menuAuthority.setLevel(groupAuthority.getLevel() + 1); - menuAuthority.setParent(groupAuthority.getId()); - menuAuthority.setPlatform(menu.platform()); - menuAuthority.setId(StrUtil.join("_", menuAuthority.getService(), menuAuthority.getNo())); - list.add(menuAuthority); - - // 功能点 - for (RoleAuthority authority : points) { - CoreRoleAuthority point = new CoreRoleAuthority(); - point.setNo(StrUtil.join("_", menuAuthority.getNo(), authority.value())); - point.setName(authority.value()); - point.setService(globalConfig.getService()); - point.setType("point"); - point.setLevel(menuAuthority.getLevel() + 1); - point.setParent(menuAuthority.getId()); - point.setPlatform(StrUtil.emptyToDefault(authority.platform(), menu.platform())); - point.setId(StrUtil.join("_", point.getService(), point.getNo())); - list.add(point); - } - - coreRoleAuthorityMapper.batchInsert(list); - } - } diff --git a/springboot-role/src/main/java/com/tiesheng/role/service/RoleAuthorityHandler.java b/springboot-role/src/main/java/com/tiesheng/role/service/RoleAuthorityHandler.java new file mode 100644 index 0000000..b501821 --- /dev/null +++ b/springboot-role/src/main/java/com/tiesheng/role/service/RoleAuthorityHandler.java @@ -0,0 +1,100 @@ +package com.tiesheng.role.service; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.tiesheng.annotation.role.RoleAuthority; +import com.tiesheng.role.mapper.CoreRoleAuthorityMapper; +import com.tiesheng.role.mapper.CoreRoleUserMapper; +import com.tiesheng.role.pojos.dao.CoreRoleAuthority; +import com.tiesheng.util.config.GlobalConfig; +import com.tiesheng.util.pojos.TokenBean; +import com.tiesheng.util.service.role.TsAuthorityHandler; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class RoleAuthorityHandler implements TsAuthorityHandler { + + @Resource + CoreRoleAuthorityMapper coreRoleAuthorityMapper; + @Resource + GlobalConfig globalConfig; + @Resource + CoreRoleUserMapper coreRoleUserMapper; + + + @Override + public void addRoleAuthority(RoleAuthority menu, List points) { + if (menu.group().length == 0 || CollUtil.isEmpty(points)) { + return; + } + + List list = new ArrayList<>(); + + // 分组 + CoreRoleAuthority groupAuthority = new CoreRoleAuthority(); + groupAuthority.setLevel(0); + for (String group : menu.group()) { + + String parentId = groupAuthority.getParent(); + int level = groupAuthority.getLevel() + 1; + String no = group; + if (StrUtil.isNotEmpty(groupAuthority.getNo())) { + no = StrUtil.join("_", groupAuthority.getNo(), group); + } + + groupAuthority = new CoreRoleAuthority(); + groupAuthority.setNo(no); + groupAuthority.setName(group); + groupAuthority.setService(globalConfig.getService()); + groupAuthority.setType("group"); + groupAuthority.setLevel(level); + groupAuthority.setPlatform(menu.platform()); + groupAuthority.setParent(parentId); + groupAuthority.setId(StrUtil.join("_", groupAuthority.getService(), groupAuthority.getNo())); + list.add(groupAuthority); + } + + + // 菜单 + CoreRoleAuthority menuAuthority = new CoreRoleAuthority(); + menuAuthority.setNo(StrUtil.join("_", menu.group(), menu.value())); + menuAuthority.setName(menu.value()); + menuAuthority.setService(globalConfig.getService()); + menuAuthority.setType("menu"); + menuAuthority.setLevel(groupAuthority.getLevel() + 1); + menuAuthority.setParent(groupAuthority.getId()); + menuAuthority.setPlatform(menu.platform()); + menuAuthority.setId(StrUtil.join("_", menuAuthority.getService(), menuAuthority.getNo())); + list.add(menuAuthority); + + // 功能点 + for (RoleAuthority authority : points) { + CoreRoleAuthority point = new CoreRoleAuthority(); + point.setNo(StrUtil.join("_", menuAuthority.getNo(), authority.value())); + point.setName(authority.value()); + point.setService(globalConfig.getService()); + point.setType("point"); + point.setLevel(menuAuthority.getLevel() + 1); + point.setParent(menuAuthority.getId()); + point.setPlatform(StrUtil.emptyToDefault(authority.platform(), menu.platform())); + point.setId(StrUtil.join("_", point.getService(), point.getNo())); + list.add(point); + } + + coreRoleAuthorityMapper.batchInsert(list); + + } + + @Override + public List getAuthorities(TokenBean tokenBean) { + List list = coreRoleUserMapper.getOwnerAuthorityLeafList(tokenBean.getId(), + tokenBean.getRoleId()); + return list.stream().map(CoreRoleAuthority::getNo).distinct().collect(Collectors.toList()); + } + +} diff --git a/springboot-util/src/main/java/com/tiesheng/util/service/TsCacheService.java b/springboot-util/src/main/java/com/tiesheng/util/service/TsCacheService.java index db15153..5e6f628 100644 --- a/springboot-util/src/main/java/com/tiesheng/util/service/TsCacheService.java +++ b/springboot-util/src/main/java/com/tiesheng/util/service/TsCacheService.java @@ -10,6 +10,8 @@ import com.tiesheng.util.service.cache.TsCacheHandler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Set; + @Service public class TsCacheService { @@ -63,6 +65,17 @@ public class TsCacheService { tsCacheHandler.remove(key); } + /** + * 获取key + * + * @param pattern + * @return + */ + public Set keys(String pattern) { + return tsCacheHandler.keys(pattern); + } + + /////////////////////////////////////////////////////////////////////////// // 图形验证码 /////////////////////////////////////////////////////////////////////////// diff --git a/springboot-util/src/main/java/com/tiesheng/util/service/cache/TsCacheHandler.java b/springboot-util/src/main/java/com/tiesheng/util/service/cache/TsCacheHandler.java index 83e53af..1b33dfb 100644 --- a/springboot-util/src/main/java/com/tiesheng/util/service/cache/TsCacheHandler.java +++ b/springboot-util/src/main/java/com/tiesheng/util/service/cache/TsCacheHandler.java @@ -1,5 +1,7 @@ package com.tiesheng.util.service.cache; +import java.util.Set; + public interface TsCacheHandler { String name(); @@ -14,4 +16,6 @@ public interface TsCacheHandler { void remove(String key); + Set keys(String prefix); + } diff --git a/springboot-util/src/main/java/com/tiesheng/util/service/cache/TsCacheRedisHandler.java b/springboot-util/src/main/java/com/tiesheng/util/service/cache/TsCacheRedisHandler.java index 3c80645..a879a9d 100644 --- a/springboot-util/src/main/java/com/tiesheng/util/service/cache/TsCacheRedisHandler.java +++ b/springboot-util/src/main/java/com/tiesheng/util/service/cache/TsCacheRedisHandler.java @@ -5,6 +5,8 @@ import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.core.RedisTemplate; import javax.annotation.Resource; +import java.util.Collections; +import java.util.Set; import java.util.concurrent.TimeUnit; @Configuration @@ -51,5 +53,10 @@ public class TsCacheRedisHandler implements TsCacheHandler { redisTemplate.delete(key); } + @Override + public Set keys(String prefix) { + return redisTemplate.keys(prefix + "*"); + } + } diff --git a/springboot-util/src/main/java/com/tiesheng/util/service/cache/TsCacheTimedHandler.java b/springboot-util/src/main/java/com/tiesheng/util/service/cache/TsCacheTimedHandler.java index 472b330..ce99de0 100644 --- a/springboot-util/src/main/java/com/tiesheng/util/service/cache/TsCacheTimedHandler.java +++ b/springboot-util/src/main/java/com/tiesheng/util/service/cache/TsCacheTimedHandler.java @@ -2,9 +2,13 @@ package com.tiesheng.util.service.cache; import cn.hutool.cache.CacheUtil; import cn.hutool.cache.impl.TimedCache; +import cn.hutool.core.util.StrUtil; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Configuration; +import java.util.Set; +import java.util.stream.Collectors; + @Configuration @ConditionalOnMissingBean(value = TsCacheHandler.class, ignored = {TsCacheTimedHandler.class, TsCacheTimedHandler.class}) public class TsCacheTimedHandler implements TsCacheHandler { @@ -63,5 +67,11 @@ public class TsCacheTimedHandler implements TsCacheHandler { getTimedCache().remove(key); } + @Override + public Set keys(String prefix) { + return getTimedCache().keySet().stream().filter(key -> StrUtil.startWith(key, prefix)) + .collect(Collectors.toSet()); + } + } diff --git a/springboot-util/src/main/java/com/tiesheng/util/service/role/TsAuthorityHandler.java b/springboot-util/src/main/java/com/tiesheng/util/service/role/TsAuthorityHandler.java new file mode 100644 index 0000000..f06f57e --- /dev/null +++ b/springboot-util/src/main/java/com/tiesheng/util/service/role/TsAuthorityHandler.java @@ -0,0 +1,31 @@ +package com.tiesheng.util.service.role; + +import com.tiesheng.annotation.role.RoleAuthority; +import com.tiesheng.util.pojos.TokenBean; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public interface TsAuthorityHandler { + + + /** + * 添加所有的权限 + * + * @param groupAuthority + * @param pointAuthorityList + * @return + */ + void addRoleAuthority(RoleAuthority groupAuthority, List pointAuthorityList); + + + /** + * 获取权限列表 + * + * @param tokenBean + * @return + */ + List getAuthorities(TokenBean tokenBean); + +}