فهرست منبع

优化权限初始化

zhou-hao 5 سال پیش
والد
کامیت
dfec08ceba

+ 46 - 9
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/DefaultReactiveAuthenticationInitializeService.java

@@ -15,10 +15,12 @@ import org.hswebframework.web.authorization.simple.SimpleUser;
 import org.hswebframework.web.authorization.simple.builder.SimpleDataAccessConfigBuilderFactory;
 import org.hswebframework.web.authorization.DimensionProvider;
 import org.hswebframework.web.system.authorization.api.entity.AuthorizationSettingEntity;
+import org.hswebframework.web.system.authorization.api.entity.ParentPermission;
 import org.hswebframework.web.system.authorization.api.entity.PermissionEntity;
 import org.hswebframework.web.system.authorization.api.entity.UserEntity;
 import org.hswebframework.web.system.authorization.api.service.reactive.ReactiveUserService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
@@ -96,17 +98,19 @@ public class DefaultReactiveAuthenticationInitializeService
                                                     List<Dimension> dimensionList,
                                                     Map<String, PermissionEntity> permissions,
                                                     Map<String, List<AuthorizationSettingEntity>> settings) {
-        List<Permission> permissionList = new ArrayList<>();
+        Map<String, PermissionEntity> permissionMap = new HashMap<>();
+        Map<String, SimplePermission> allowed = new HashMap<>();
 
-        for (PermissionEntity value : permissions.values()) {
-            List<AuthorizationSettingEntity> permissionSettings = settings.get(value.getId());
+        for (PermissionEntity permissionEntity : permissions.values()) {
+            permissionMap.put(permissionEntity.getId(), permissionEntity);
+            List<AuthorizationSettingEntity> permissionSettings = settings.get(permissionEntity.getId());
             if (CollectionUtils.isEmpty(permissionSettings)) {
                 continue;
             }
             permissionSettings.sort(Comparator.comparingInt(e -> e.getPriority() == null ? 0 : e.getPriority()));
             SimplePermission permission = new SimplePermission();
-            permission.setId(value.getId());
-            permission.setName(value.getName());
+            permission.setId(permissionEntity.getId());
+            permission.setName(permissionEntity.getName());
             Map<DataAccessType, DataAccessConfig> configs = new HashMap<>();
 
             for (AuthorizationSettingEntity permissionSetting : permissionSettings) {
@@ -123,15 +127,48 @@ public class DefaultReactiveAuthenticationInitializeService
                             .map(conf -> builderFactory.create().fromMap(conf.getConfig()).build())
                             .forEach(access -> configs.put(access.getType(), access));
                 }
-
-                permission.getActions().addAll(permissionSetting.getActions());
+                if (CollectionUtils.isNotEmpty(permissionSetting.getActions())) {
+                    permission.getActions().addAll(permissionSetting.getActions());
+                }
 
             }
+            allowed.put(permissionEntity.getId(), permission);
             permission.setDataAccesses(new HashSet<>(configs.values()));
-            permissionList.add(permission);
+        }
 
+        //处理关联权限
+        for (PermissionEntity permissionEntity : permissions.values()) {
+            SimplePermission allow = allowed.get(permissionEntity.getId());
+            if (allow == null || CollectionUtils.isEmpty(permissionEntity.getParents())) {
+                continue;
+            }
+            for (ParentPermission parent : permissionEntity.getParents()) {
+                if (StringUtils.isEmpty(parent.getPermission())) {
+                    continue;
+                }
+                Set<String> pre = parent.getPreActions();
+                //满足前置条件
+                if (CollectionUtils.isEmpty(pre) || allow.getActions().containsAll(pre)) {
+                    PermissionEntity mergePermission = permissionMap.get(parent.getPermission());
+                    if (mergePermission == null) {
+                        continue;
+                    }
+                    SimplePermission merge = allowed.get(parent.getPermission());
+                    if (merge == null) {
+                        merge = new SimplePermission();
+                        merge.setName(mergePermission.getName());
+                        merge.setId(mergePermission.getId());
+                        allowed.put(merge.getId(), merge);
+                    }
+                    if (CollectionUtils.isNotEmpty(parent.getActions())) {
+                        merge.getActions().addAll(parent.getActions());
+                    }
+                }
+            }
         }
-        authentication.setPermissions(permissionList);
+
+
+        authentication.setPermissions(new ArrayList<>(allowed.values()));
 
         return authentication;
     }