dengzedong
2024-12-24 aa0382e44311f9f7e62a688c8fcaa9c69a512e0f
提交 | 用户 | 时间
e7c126 1 package com.iailab.framework.security.core.service;
H 2
3 import cn.hutool.core.collection.CollUtil;
4 import com.iailab.framework.common.core.KeyValue;
5 import com.iailab.framework.security.core.LoginUser;
6 import com.iailab.framework.security.core.util.SecurityFrameworkUtils;
7 import com.iailab.module.system.api.permission.PermissionApi;
8 import com.google.common.cache.CacheLoader;
9 import com.google.common.cache.LoadingCache;
10 import lombok.AllArgsConstructor;
11 import lombok.SneakyThrows;
12
13 import java.time.Duration;
14 import java.util.Arrays;
15 import java.util.List;
16
17 import static com.iailab.framework.common.util.cache.CacheUtils.buildAsyncReloadingCache;
18 import static com.iailab.framework.common.util.cache.CacheUtils.buildCache;
19 import static com.iailab.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
20
21 /**
22  * 默认的 {@link SecurityFrameworkService} 实现类
23  *
24  * @author iailab
25  */
26 @AllArgsConstructor
27 public class SecurityFrameworkServiceImpl implements SecurityFrameworkService {
28
29     private final PermissionApi permissionApi;
30
31     /**
32      * 针对 {@link #hasAnyRoles(String...)} 的缓存
33      */
34     private final LoadingCache<KeyValue<Long, List<String>>, Boolean> hasAnyRolesCache = buildCache(
35             Duration.ofMinutes(1L), // 过期时间 1 分钟
36             new CacheLoader<KeyValue<Long, List<String>>, Boolean>() {
37
38                 @Override
39                 public Boolean load(KeyValue<Long, List<String>> key) {
40                     return permissionApi.hasAnyRoles(key.getKey(), key.getValue().toArray(new String[0])).getCheckedData();
41                 }
42
43             });
44
45     /**
46      * 针对 {@link #hasAnyPermissions(String...)} 的缓存
47      */
48     private final LoadingCache<KeyValue<Long, List<String>>, Boolean> hasAnyPermissionsCache = buildCache(
49             Duration.ofMinutes(1L), // 过期时间 1 分钟
50             new CacheLoader<KeyValue<Long, List<String>>, Boolean>() {
51
52                 @Override
53                 public Boolean load(KeyValue<Long, List<String>> key) {
54                     return permissionApi.hasAnyPermissions(key.getKey(), key.getValue().toArray(new String[0])).getCheckedData();
55                 }
56
57             });
58
59     @Override
60     public boolean hasPermission(String permission) {
61         return hasAnyPermissions(permission);
62     }
63
64     @Override
65     @SneakyThrows
66     public boolean hasAnyPermissions(String... permissions) {
4a47e4 67         Long userId = getLoginUserId();
H 68         if (userId == null) {
69             return false;
70         }
71         return hasAnyPermissionsCache.get(new KeyValue<>(userId, Arrays.asList(permissions)));
e7c126 72     }
H 73
74     @Override
75     public boolean hasRole(String role) {
76         return hasAnyRoles(role);
77     }
78
79     @Override
80     @SneakyThrows
81     public boolean hasAnyRoles(String... roles) {
4a47e4 82         Long userId = getLoginUserId();
H 83         if (userId == null) {
84             return false;
85         }
86         return hasAnyRolesCache.get(new KeyValue<>(userId, Arrays.asList(roles)));
e7c126 87     }
H 88
89     @Override
90     public boolean hasScope(String scope) {
91         return hasAnyScopes(scope);
92     }
93
94     @Override
95     public boolean hasAnyScopes(String... scope) {
96         LoginUser user = SecurityFrameworkUtils.getLoginUser();
97         if (user == null) {
98             return false;
99         }
100         return CollUtil.containsAny(user.getScopes(), Arrays.asList(scope));
101     }
102
103 }