From 0045602e6b1184a9bf24019b13082d9cdf5cac78 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 17 Jun 2022 08:36:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20SecurityFrameworkServiceIm?= =?UTF-8?q?pl=20=E7=9A=84=E7=BC=93=E5=AD=98=EF=BC=8C=E6=8F=90=E5=8D=87?= =?UTF-8?q?=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/framework/common/core/KeyValue.java | 1 + .../pom.xml | 6 +++ .../service/SecurityFrameworkServiceImpl.java | 51 ++++++++++++++++--- .../admin/permission/RoleController.http | 2 +- 4 files changed, 53 insertions(+), 7 deletions(-) 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}}