diff --git a/youlai-admin/admin-boot/src/main/java/com/youlai/admin/service/impl/SysPermissionServiceImpl.java b/youlai-admin/admin-boot/src/main/java/com/youlai/admin/service/impl/SysPermissionServiceImpl.java index 630de1bd6da0aa68f2d02caac5856e079ee8aff0..b84ba2bbbc7fcd8dfc6eb3d2cec523c945ceba2e 100644 --- a/youlai-admin/admin-boot/src/main/java/com/youlai/admin/service/impl/SysPermissionServiceImpl.java +++ b/youlai-admin/admin-boot/src/main/java/com/youlai/admin/service/impl/SysPermissionServiceImpl.java @@ -21,6 +21,7 @@ public class SysPermissionServiceImpl extends ServiceImpl listPermRoles() { return this.baseMapper.listPermRoles(); @@ -50,6 +51,7 @@ public class SysPermissionServiceImpl extends ServiceImpl角色(集合)】规则 List btnPermList = permissions.stream() diff --git a/youlai-common/common-redis/src/main/java/com/youlai/common/redis/RedisConfig.java b/youlai-common/common-redis/src/main/java/com/youlai/common/redis/RedisConfig.java index 9359bcf224a69b867876a2274c9925d7c8ad2ede..0225c1f9275f47ebc42f2806a009ce4e30ffda9d 100644 --- a/youlai-common/common-redis/src/main/java/com/youlai/common/redis/RedisConfig.java +++ b/youlai-common/common-redis/src/main/java/com/youlai/common/redis/RedisConfig.java @@ -16,7 +16,6 @@ import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration @AutoConfigureBefore(RedisAutoConfiguration.class) public class RedisConfig { - @Bean public RedisTemplate redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) { diff --git a/youlai-gateway/src/main/java/com/youlai/gateway/component/AdminRoleLocalCache.java b/youlai-gateway/src/main/java/com/youlai/gateway/component/AdminRoleLocalCache.java new file mode 100644 index 0000000000000000000000000000000000000000..3724847f2ac904bce4ba1c82b9a9441140b00bf3 --- /dev/null +++ b/youlai-gateway/src/main/java/com/youlai/gateway/component/AdminRoleLocalCache.java @@ -0,0 +1,45 @@ +package com.youlai.gateway.component; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** +* @author DaniR +* @version 1.0 +* @description 本地缓存设置 +* @createDate 2021/6/16 10:08 +*/ +@Slf4j +@Component +public class AdminRoleLocalCache { + private Cache localCache = null; + + @PostConstruct + private void init(){ + localCache = CacheBuilder.newBuilder() + //设置本地缓存容器的初始容量 + .initialCapacity(1) + //设置本地缓存的最大容量 + .maximumSize(10) + //设置写缓存后多少秒过期 + .expireAfterWrite(120, TimeUnit.SECONDS).build(); + } + + + public void setLocalCache(String key,T object){ + localCache.put(key,object); + } + + public T getCache(String key){ + return (T) localCache.getIfPresent(key); + } + public void remove(String key){ + localCache.invalidate(key); + } +} diff --git a/youlai-gateway/src/main/java/com/youlai/gateway/component/RedisChannelListener.java b/youlai-gateway/src/main/java/com/youlai/gateway/component/RedisChannelListener.java new file mode 100644 index 0000000000000000000000000000000000000000..c9e9017bc87663a97151b5e12be0aa13ceedc973 --- /dev/null +++ b/youlai-gateway/src/main/java/com/youlai/gateway/component/RedisChannelListener.java @@ -0,0 +1,23 @@ +package com.youlai.gateway.component; + +import cn.hutool.core.util.StrUtil; +import com.youlai.common.constant.GlobalConstants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.connection.Message; +import org.springframework.data.redis.connection.MessageListener; + +import java.nio.charset.StandardCharsets; + +public class RedisChannelListener implements MessageListener { + + @Autowired + private AdminRoleLocalCache adminRoleLocalCache; + + @Override + public void onMessage(Message message, byte[] bytes) { + String msg = new String(message.getBody(), StandardCharsets.UTF_8); + String channel = new String(message.getChannel(), StandardCharsets.UTF_8); + adminRoleLocalCache.remove(GlobalConstants.URL_PERM_ROLES_KEY); + + } +} diff --git a/youlai-gateway/src/main/java/com/youlai/gateway/config/RedisGatewyConfig.java b/youlai-gateway/src/main/java/com/youlai/gateway/config/RedisGatewyConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..f6a238d60aa6257db1b9a63d08a4cfc61a9a7c76 --- /dev/null +++ b/youlai-gateway/src/main/java/com/youlai/gateway/config/RedisGatewyConfig.java @@ -0,0 +1,40 @@ +package com.youlai.gateway.config; + +import com.youlai.gateway.component.RedisChannelListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.listener.ChannelTopic; +import org.springframework.data.redis.listener.RedisMessageListenerContainer; +import org.springframework.data.redis.listener.adapter.MessageListenerAdapter; + +@Configuration +public class RedisGatewyConfig { + + @Autowired + private RedisConnectionFactory connectionFactory; + + @Bean + public RedisMessageListenerContainer redisMessageListenerContainer(){ + RedisMessageListenerContainer container = new RedisMessageListenerContainer(); + container.setConnectionFactory(connectionFactory); + container.addMessageListener(messageListenerAdapter(),channelTopic()); + return container; + } + + @Bean + MessageListenerAdapter messageListenerAdapter(){ + return new MessageListenerAdapter(redisChannelListener()); + } + + @Bean + RedisChannelListener redisChannelListener(){ + return new RedisChannelListener(); + } + @Bean + ChannelTopic channelTopic(){ + return new ChannelTopic("cleanRoleLocalCache"); + } + +} diff --git a/youlai-gateway/src/main/java/com/youlai/gateway/security/ResourceServerManager.java b/youlai-gateway/src/main/java/com/youlai/gateway/security/ResourceServerManager.java index e3b728744d03bcd4a2f37c6274f9e726bddfb572..d31ab1214ccff13e50b0a70cbc8f1f3177390ba6 100644 --- a/youlai-gateway/src/main/java/com/youlai/gateway/security/ResourceServerManager.java +++ b/youlai-gateway/src/main/java/com/youlai/gateway/security/ResourceServerManager.java @@ -8,8 +8,10 @@ import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.youlai.common.constant.AuthConstants; import com.youlai.common.constant.GlobalConstants; +import com.youlai.gateway.component.AdminRoleLocalCache; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.http.HttpMethod; import org.springframework.http.server.reactive.ServerHttpRequest; @@ -39,7 +41,11 @@ import java.util.Set; public class ResourceServerManager implements ReactiveAuthorizationManager { private RedisTemplate redisTemplate; + private AdminRoleLocalCache adminRoleLocalCache; + // 是否演示环境 + @Value("${demo}") + private Boolean isDemoEnv; @Override public Mono check(Mono mono, AuthorizationContext authorizationContext) { ServerHttpRequest request = authorizationContext.getExchange().getRequest(); @@ -65,9 +71,14 @@ public class ResourceServerManager implements ReactiveAuthorizationManager角色集合】权限规则 - Map permRolesRules = redisTemplate.opsForHash().entries(GlobalConstants.URL_PERM_ROLES_KEY); + Map permRolesRules = (Map) adminRoleLocalCache.getCache(GlobalConstants.URL_PERM_ROLES_KEY); + if (isDemoEnv){ + // 缓存取【URL权限标识->角色集合】权限规则 + if(null==permRolesRules){ + permRolesRules = redisTemplate.opsForHash().entries(GlobalConstants.URL_PERM_ROLES_KEY); + adminRoleLocalCache.setLocalCache(GlobalConstants.URL_PERM_ROLES_KEY,permRolesRules); + } + } // 根据 “请求路径” 和 权限规则中的“URL权限标识”进行Ant匹配,得出拥有权限的角色集合 Set hasPermissionRoles = CollectionUtil.newHashSet(); // 【声明定义】有权限的角色集合