权限问题修复:executor、report权限缓存清空感知补充

This commit is contained in:
gaoqr
2025-03-25 16:42:19 +08:00
parent 24d1649854
commit e5e8806816
9 changed files with 92 additions and 29 deletions
@@ -11,4 +11,9 @@ public class RedisKeyConstants {
* 生产单导入 * 生产单导入
*/ */
public static final String ORDER_IMPORT_LOCK_KEY = "order_import:%s"; public static final String ORDER_IMPORT_LOCK_KEY = "order_import:%s";
/**
* 刷新权限
*/
public static final String PERMISSION_REFRESH = "PERMISSION_REFRESH";
} }
@@ -0,0 +1,33 @@
package com.cf.imes.module.executor.dal.redis.listener;
import com.cf.imes.framework.mq.redis.core.pubsub.AbstractRedisSimpleMessageListener;
import com.cf.imes.framework.redis.constants.RedisKeyConstants;
import com.cf.imes.framework.security.core.service.SecurityFrameworkService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.stereotype.Component;
/**
* executor PERMISSION_REFRESH redis监听器
*
* @author Gqr
* @since 2024/6/13 10:32
*/
@Component
@Slf4j
public class ExecutorPermissionRefreshRedisListener extends AbstractRedisSimpleMessageListener {
private final SecurityFrameworkService securityFrameworkService;
public ExecutorPermissionRefreshRedisListener(SecurityFrameworkService securityFrameworkService) {
super.setTopic(new ChannelTopic(RedisKeyConstants.PERMISSION_REFRESH));
this.securityFrameworkService = securityFrameworkService;
}
@Override
public void onMessage(Message message, byte[] bytes) {
log.info("[SystemPermissionRefreshRedisListener][onMessage][{}收到刷新本地权限缓存]", message);
securityFrameworkService.invalidateAllPermissionsCache();
}
}
@@ -166,6 +166,12 @@
<version>${itextpdf.version}</version> <version>${itextpdf.version}</version>
</dependency> </dependency>
<!--ureport-core 相关end--> <!--ureport-core 相关end-->
<!-- 消息队列相关 -->
<dependency>
<groupId>com.cf.imes</groupId>
<artifactId>cf-spring-boot-starter-mq</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>
<!-- 设置构建的 jar 包名 --> <!-- 设置构建的 jar 包名 -->
@@ -232,6 +238,10 @@
<groupId>com.cf.imes</groupId> <groupId>com.cf.imes</groupId>
<artifactId>cf-spring-boot-starter-web</artifactId> <artifactId>cf-spring-boot-starter-web</artifactId>
</include> </include>
<include>
<groupId>com.cf.imes</groupId>
<artifactId>cf-spring-boot-starter-mq</artifactId>
</include>
</includes> </includes>
</configuration> </configuration>
<executions> <executions>
@@ -0,0 +1,33 @@
package com.cf.imes.module.report.dal.redis.listener;
import com.cf.imes.framework.mq.redis.core.pubsub.AbstractRedisSimpleMessageListener;
import com.cf.imes.framework.redis.constants.RedisKeyConstants;
import com.cf.imes.framework.security.core.service.SecurityFrameworkService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.stereotype.Component;
/**
* report PERMISSION_REFRESH redis监听器
*
* @author Gqr
* @since 2024/6/13 10:32
*/
@Component
@Slf4j
public class ReportPermissionRefreshRedisListener extends AbstractRedisSimpleMessageListener {
private final SecurityFrameworkService securityFrameworkService;
public ReportPermissionRefreshRedisListener(SecurityFrameworkService securityFrameworkService) {
super.setTopic(new ChannelTopic(RedisKeyConstants.PERMISSION_REFRESH));
this.securityFrameworkService = securityFrameworkService;
}
@Override
public void onMessage(Message message, byte[] bytes) {
log.info("[SystemPermissionRefreshRedisListener][onMessage][{}收到刷新本地权限缓存]", message);
securityFrameworkService.invalidateAllPermissionsCache();
}
}
@@ -1,15 +0,0 @@
package com.cf.imes.module.system.dal.redis;
/**
* system redis监听刷新通道名称 常量
*
* @author Gqr
* @since 2024/6/13 14:55
*/
public class RedisRefreshChannelTopicConstants {
/**
* 刷新权限
*/
public static final String PERMISSION_REFRESH = "PERMISSION_REFRESH";
}
@@ -1,8 +1,8 @@
package com.cf.imes.module.system.dal.redis.listener; package com.cf.imes.module.system.dal.redis.listener;
import com.cf.imes.framework.mq.redis.core.pubsub.AbstractRedisSimpleMessageListener; import com.cf.imes.framework.mq.redis.core.pubsub.AbstractRedisSimpleMessageListener;
import com.cf.imes.framework.redis.constants.RedisKeyConstants;
import com.cf.imes.framework.security.core.service.SecurityFrameworkService; import com.cf.imes.framework.security.core.service.SecurityFrameworkService;
import com.cf.imes.module.system.dal.redis.RedisRefreshChannelTopicConstants;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.ChannelTopic; import org.springframework.data.redis.listener.ChannelTopic;
@@ -21,7 +21,7 @@ public class SystemPermissionRefreshRedisListener extends AbstractRedisSimpleMes
private final SecurityFrameworkService securityFrameworkService; private final SecurityFrameworkService securityFrameworkService;
public SystemPermissionRefreshRedisListener(SecurityFrameworkService securityFrameworkService) { public SystemPermissionRefreshRedisListener(SecurityFrameworkService securityFrameworkService) {
super.setTopic(new ChannelTopic(RedisRefreshChannelTopicConstants.PERMISSION_REFRESH)); super.setTopic(new ChannelTopic(RedisKeyConstants.PERMISSION_REFRESH));
this.securityFrameworkService = securityFrameworkService; this.securityFrameworkService = securityFrameworkService;
} }
@@ -9,7 +9,6 @@ import com.cf.imes.module.system.controller.admin.permission.vo.menu.MenuSaveVO;
import com.cf.imes.module.system.dal.dataobject.permission.MenuDO; import com.cf.imes.module.system.dal.dataobject.permission.MenuDO;
import com.cf.imes.module.system.dal.mysql.permission.MenuMapper; import com.cf.imes.module.system.dal.mysql.permission.MenuMapper;
import com.cf.imes.module.system.dal.redis.RedisKeyConstants; import com.cf.imes.module.system.dal.redis.RedisKeyConstants;
import com.cf.imes.module.system.dal.redis.RedisRefreshChannelTopicConstants;
import com.cf.imes.module.system.enums.permission.MenuTypeEnum; import com.cf.imes.module.system.enums.permission.MenuTypeEnum;
import com.cf.imes.module.system.service.organ.OrganService; import com.cf.imes.module.system.service.organ.OrganService;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
@@ -160,9 +159,9 @@ public class MenuServiceImpl implements MenuService {
} }
// 清空本地缓存 // 清空本地缓存
redisTemplate.convertAndSend(RedisRefreshChannelTopicConstants.PERMISSION_REFRESH, ""); redisTemplate.convertAndSend(com.cf.imes.framework.redis.constants.RedisKeyConstants.PERMISSION_REFRESH, "");
}).exceptionally(e -> { }).exceptionally(e -> {
log.error("[deleteMenu] redis 清空PERMISSION_MENU_ID_LIST或message发送失败, topic:{}, 异常:{}", RedisRefreshChannelTopicConstants.PERMISSION_REFRESH, e); log.error("[deleteMenu] redis 清空PERMISSION_MENU_ID_LIST或message发送失败, topic:{}, 异常:{}", com.cf.imes.framework.redis.constants.RedisKeyConstants.PERMISSION_REFRESH, e);
return null; return null;
}); });
} }
@@ -29,7 +29,6 @@ import com.cf.imes.module.system.dal.dataobject.user.AdminUserDO;
import com.cf.imes.module.system.dal.mysql.permission.RoleMenuMapper; import com.cf.imes.module.system.dal.mysql.permission.RoleMenuMapper;
import com.cf.imes.module.system.dal.mysql.permission.UserRoleMapper; import com.cf.imes.module.system.dal.mysql.permission.UserRoleMapper;
import com.cf.imes.module.system.dal.redis.RedisKeyConstants; import com.cf.imes.module.system.dal.redis.RedisKeyConstants;
import com.cf.imes.module.system.dal.redis.RedisRefreshChannelTopicConstants;
import com.cf.imes.module.system.enums.ErrorCodeConstants; import com.cf.imes.module.system.enums.ErrorCodeConstants;
import com.cf.imes.module.system.enums.permission.DataScopeEnum; import com.cf.imes.module.system.enums.permission.DataScopeEnum;
import com.cf.imes.module.system.service.dept.DeptService; import com.cf.imes.module.system.service.dept.DeptService;
@@ -255,7 +254,7 @@ public class PermissionServiceImpl implements PermissionService {
log.info("[assignRoleMenu] 批量删除redis[{}]数量:{}", patternKey, batchDelNum); log.info("[assignRoleMenu] 批量删除redis[{}]数量:{}", patternKey, batchDelNum);
}); });
} }
stringRedisTemplate.convertAndSend(RedisRefreshChannelTopicConstants.PERMISSION_REFRESH, ""); stringRedisTemplate.convertAndSend(com.cf.imes.framework.redis.constants.RedisKeyConstants.PERMISSION_REFRESH, "");
}) })
.thenRunAsync(() -> { .thenRunAsync(() -> {
// 清空角色下用户的token缓存 // 清空角色下用户的token缓存
@@ -508,9 +507,9 @@ public class PermissionServiceImpl implements PermissionService {
log.info("[batchAssignRoleUsers] 批量删除redis[{}]数量:{}", patternKey, batchDelNum); log.info("[batchAssignRoleUsers] 批量删除redis[{}]数量:{}", patternKey, batchDelNum);
}); });
} }
stringRedisTemplate.convertAndSend(RedisRefreshChannelTopicConstants.PERMISSION_REFRESH, ""); stringRedisTemplate.convertAndSend(com.cf.imes.framework.redis.constants.RedisKeyConstants.PERMISSION_REFRESH, "");
}).exceptionally(e -> { }).exceptionally(e -> {
log.error("[batchAssignRoleUsers] redis 清空USER_ROLE_ID_LIST或message发送失败, topic:{}, 异常:{}", RedisRefreshChannelTopicConstants.PERMISSION_REFRESH, e); log.error("[batchAssignRoleUsers] redis 清空USER_ROLE_ID_LIST或message发送失败, topic:{}, 异常:{}", com.cf.imes.framework.redis.constants.RedisKeyConstants.PERMISSION_REFRESH, e);
return null; return null;
}); });
} }
@@ -590,9 +589,9 @@ public class PermissionServiceImpl implements PermissionService {
CompletableFuture.runAsync(() -> { CompletableFuture.runAsync(() -> {
// 移除redis中的缓存 // 移除redis中的缓存
stringRedisTemplate.delete(String.format(String.valueOf(new StringBuffer(RedisKeyConstants.USER_ROLE_ID_LIST).append(":%s:%s")), organId, userId)); stringRedisTemplate.delete(String.format(String.valueOf(new StringBuffer(RedisKeyConstants.USER_ROLE_ID_LIST).append(":%s:%s")), organId, userId));
stringRedisTemplate.convertAndSend(RedisRefreshChannelTopicConstants.PERMISSION_REFRESH, ""); stringRedisTemplate.convertAndSend(com.cf.imes.framework.redis.constants.RedisKeyConstants.PERMISSION_REFRESH, "");
}).exceptionally(e -> { }).exceptionally(e -> {
log.error("[assignUserRole] redis message发送失败, topic:{}, 异常:{}", RedisRefreshChannelTopicConstants.PERMISSION_REFRESH, e); log.error("[assignUserRole] redis message发送失败, topic:{}, 异常:{}", com.cf.imes.framework.redis.constants.RedisKeyConstants.PERMISSION_REFRESH, e);
return null; return null;
}); });
} }
@@ -764,7 +763,7 @@ public class PermissionServiceImpl implements PermissionService {
}) })
.thenRunAsync(() -> { .thenRunAsync(() -> {
//通知刷新本地权限缓存 //通知刷新本地权限缓存
stringRedisTemplate.convertAndSend(RedisRefreshChannelTopicConstants.PERMISSION_REFRESH, ""); stringRedisTemplate.convertAndSend(com.cf.imes.framework.redis.constants.RedisKeyConstants.PERMISSION_REFRESH, "");
}) })
.exceptionally(e -> { .exceptionally(e -> {
log.error("[PermissionService][flushCacheWhenTenantPackageChange]失败, 异常:{}", e); log.error("[PermissionService][flushCacheWhenTenantPackageChange]失败, 异常:{}", e);
@@ -19,7 +19,6 @@ import com.cf.imes.module.system.controller.admin.permission.vo.role.RoleSaveReq
import com.cf.imes.module.system.dal.dataobject.permission.RoleDO; import com.cf.imes.module.system.dal.dataobject.permission.RoleDO;
import com.cf.imes.module.system.dal.mysql.permission.RoleMapper; import com.cf.imes.module.system.dal.mysql.permission.RoleMapper;
import com.cf.imes.module.system.dal.redis.RedisKeyConstants; import com.cf.imes.module.system.dal.redis.RedisKeyConstants;
import com.cf.imes.module.system.dal.redis.RedisRefreshChannelTopicConstants;
import com.cf.imes.module.system.enums.ErrorCodeConstants; import com.cf.imes.module.system.enums.ErrorCodeConstants;
import com.cf.imes.module.system.enums.permission.DataScopeEnum; import com.cf.imes.module.system.enums.permission.DataScopeEnum;
import com.cf.imes.module.system.enums.permission.RoleCodeEnum; import com.cf.imes.module.system.enums.permission.RoleCodeEnum;
@@ -178,7 +177,7 @@ public class RoleServiceImpl implements RoleService {
} }
} }
// 通知刷新本地缓存 // 通知刷新本地缓存
stringRedisTemplate.convertAndSend(RedisRefreshChannelTopicConstants.PERMISSION_REFRESH, ""); stringRedisTemplate.convertAndSend(com.cf.imes.framework.redis.constants.RedisKeyConstants.PERMISSION_REFRESH, "");
} }
/** /**