diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/core/KeyValue.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/core/KeyValue.java
index 48cf8e7ef..ef432e218 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/core/KeyValue.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/core/KeyValue.java
@@ -1,5 +1,6 @@
package cn.iocoder.yudao.framework.common.core;
+import com.google.common.base.Objects;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
diff --git a/yudao-framework/yudao-spring-boot-starter-security/pom.xml b/yudao-framework/yudao-spring-boot-starter-security/pom.xml
index 2cbae6d00..2e5dc7e2e 100644
--- a/yudao-framework/yudao-spring-boot-starter-security/pom.xml
+++ b/yudao-framework/yudao-spring-boot-starter-security/pom.xml
@@ -57,6 +57,12 @@
yudao-module-system-api
${revision}
+
+
+
+ com.google.guava
+ guava
+
diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/service/SecurityFrameworkServiceImpl.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/service/SecurityFrameworkServiceImpl.java
index a53fb922b..26975f633 100644
--- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/service/SecurityFrameworkServiceImpl.java
+++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/service/SecurityFrameworkServiceImpl.java
@@ -1,13 +1,24 @@
package cn.iocoder.yudao.framework.security.core.service;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.HashUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.iocoder.yudao.framework.common.core.KeyValue;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.util.cache.CacheUtils;
import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.system.api.permission.PermissionApi;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
import lombok.AllArgsConstructor;
+import lombok.SneakyThrows;
+import java.time.Duration;
import java.util.Arrays;
+import java.util.List;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@@ -21,16 +32,45 @@ public class SecurityFrameworkServiceImpl implements SecurityFrameworkService {
private final PermissionApi permissionApi;
+ /**
+ * 针对 {@link #hasAnyRoles(String...)} 的缓存
+ */
+ private final LoadingCache>, Boolean> hasAnyRolesCache = CacheUtils.buildAsyncReloadingCache(
+ Duration.ofMinutes(1L), // 过期时间 1 分钟
+ new CacheLoader>, Boolean>() {
+ @Override
+ public Boolean load(KeyValue> key) {
+ CommonResult hasAnyRolesResult = permissionApi.hasAnyRoles(key.getKey(),
+ key.getValue().toArray(new String[0]));
+ hasAnyRolesResult.checkError();
+ return hasAnyRolesResult.getData();
+ }
+ });
+
+ /**
+ * 针对 {@link #hasAnyPermissions(String...)} 的缓存
+ */
+ private final LoadingCache>, Boolean> hasAnyPermissionsCache = CacheUtils.buildAsyncReloadingCache(
+ Duration.ofMinutes(1L), // 过期时间 1 分钟
+ new CacheLoader>, Boolean>() {
+ @Override
+ public Boolean load(KeyValue> key) {
+ CommonResult hasAnyPermissionsResult = permissionApi.hasAnyPermissions(key.getKey(),
+ key.getValue().toArray(new String[0]));
+ hasAnyPermissionsResult.checkError();
+ return hasAnyPermissionsResult.getData();
+ }
+ });
+
@Override
public boolean hasPermission(String permission) {
return hasAnyPermissions(permission);
}
@Override
+ @SneakyThrows
public boolean hasAnyPermissions(String... permissions) {
- CommonResult hasAnyPermissionsResult = permissionApi.hasAnyPermissions(getLoginUserId(), permissions);
- hasAnyPermissionsResult.checkError();
- return hasAnyPermissionsResult.getData();
+ return hasAnyPermissionsCache.get(new KeyValue<>(getLoginUserId(), Arrays.asList(permissions)));
}
@Override
@@ -39,10 +79,9 @@ public class SecurityFrameworkServiceImpl implements SecurityFrameworkService {
}
@Override
+ @SneakyThrows
public boolean hasAnyRoles(String... roles) {
- CommonResult hasAnyRolesResult = permissionApi.hasAnyRoles(getLoginUserId(), roles);
- hasAnyRolesResult.checkError();
- return hasAnyRolesResult.getData();
+ return hasAnyRolesCache.get(new KeyValue<>(getLoginUserId(), Arrays.asList(roles)));
}
@Override
diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.http b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.http
index c28725d86..de109ea28 100644
--- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.http
+++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/permission/RoleController.http
@@ -31,7 +31,7 @@ tenant-id: {{adminTenentId}}
roleId=14
### /role/get 成功
-GET {{baseUrl}}/system/role/get?id=100
+GET {{systemBaseUrl}}/system/role/get?id=100
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer {{token}}
tenant-id: {{adminTenentId}}