Parcourir la source

优化权限关联逻辑

zhouhao il y a 6 ans
Parent
commit
822dffa1b9

+ 5 - 2
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/entity/authorization/SimplePermissionEntity.java

@@ -17,9 +17,9 @@ import java.util.stream.Collectors;
 @Setter
 @NoArgsConstructor
 public class SimplePermissionEntity extends SimpleGenericEntity<String> implements PermissionEntity {
-    private static final long serialVersionUID = -5505339187716888516L;
+    private static final long   serialVersionUID = -5505339187716888516L;
     @NotBlank
-    private String name;
+    private              String name;
 
     private String describe;
 
@@ -44,6 +44,9 @@ public class SimplePermissionEntity extends SimpleGenericEntity<String> implemen
         if (actions != null) {
             target.setActions(getActions().stream().map(ActionEntity::clone).collect(Collectors.toList()));
         }
+        if (parents != null) {
+            target.setParents(new ArrayList<>(getParents()));
+        }
         if (optionalFields != null) {
             target.setOptionalFields(getOptionalFields().stream().map(OptionalField::clone).collect(Collectors.toList()));
         }

+ 28 - 21
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-local/src/main/java/org/hswebframework/web/service/authorization/simple/SimpleAuthorizationSettingService.java

@@ -367,6 +367,9 @@ public class SimpleAuthorizationSettingService extends GenericEntityService<Auth
         private String sourcePermission;
 
         public static Stream<ParentPermissionDetail> of(PermissionEntity entity) {
+            if (isEmpty(entity.getParents())) {
+                return Stream.empty();
+            }
             return entity.getParents()
                     .stream()
                     .filter(Objects::nonNull)
@@ -383,15 +386,14 @@ public class SimpleAuthorizationSettingService extends GenericEntityService<Auth
 
     private List<Permission> initPermission(List<AuthorizationSettingDetailEntity> detailList) {
         //权限id集合
-        List<String> permissionIds = detailList.stream()
-                .map(AuthorizationSettingDetailEntity::getPermissionId)
-                .distinct()
-                .collect(Collectors.toList());
+//        List<String> permissionIds = detailList.stream()
+//                .map(AuthorizationSettingDetailEntity::getPermissionId)
+//                .distinct()
+//                .collect(Collectors.toList());
         //权限信息缓存
-        Map<String, PermissionEntity> permissionEntityCache =
-                permissionService.selectByPk(permissionIds)
-                        .stream()
-                        .collect(Collectors.toMap(PermissionEntity::getId, Function.identity()));
+        Map<String, PermissionEntity> permissionEntityCache = permissionService.select()
+                .stream()
+                .collect(Collectors.toMap(PermissionEntity::getId, Function.identity()));
 
         //防止越权
         detailList = detailList.stream().filter(detail -> {
@@ -477,6 +479,18 @@ public class SimpleAuthorizationSettingService extends GenericEntityService<Auth
                 .flatMap(ParentPermissionDetail::of)
                 .collect(Collectors.groupingBy(ParentPermission::getPermission));
 
+        //判断是否满足关联权限的条件
+        Predicate<ParentPermissionDetail> preActionPredicate = parent -> {
+            if (isEmpty(parent.getActions())) {
+                return false;
+            }
+            if (isEmpty(parent.getPreActions())) {
+                return true;
+            }
+            Permission source = permissionCache.get(parent.getSourcePermission());
+            return source != null && source.getActions().containsAll(parent.getPreActions());
+        };
+
         for (Permission permission : permissions) {
             //有其他权限关联了此权限
             List<ParentPermissionDetail> parents = parentsPermissions.get(permission.getId());
@@ -484,17 +498,7 @@ public class SimpleAuthorizationSettingService extends GenericEntityService<Auth
                 //添加action
                 permission.getActions()
                         .addAll(parents.stream()
-                                .filter(parent -> {
-                                    if (CollectionUtils.isEmpty(parent.getActions())) {
-                                        return false;
-                                    }
-                                    if (CollectionUtils.isEmpty(parent.getPreActions())) {
-                                        return true;
-                                    }
-                                    //判断是否满足关联权限的条件
-                                    Permission source = permissionCache.get(parent.getSourcePermission());
-                                    return source != null && parent.getPreActions().containsAll(source.getActions());
-                                })
+                                .filter(preActionPredicate)
                                 .map(ParentPermission::getActions)
                                 .flatMap(Collection::stream)
                                 .collect(Collectors.toSet()));
@@ -504,7 +508,7 @@ public class SimpleAuthorizationSettingService extends GenericEntityService<Auth
         }
         //没有赋予被关联的权限时,直接关联权限
         parentsPermissions.forEach((per, all) -> {
-            PermissionEntity entity = permissionEntityCache.get(permissionId);
+            PermissionEntity entity = permissionEntityCache.get(per);
             if (entity == null || !DataStatus.STATUS_ENABLED.equals(entity.getStatus())) {
                 return;
             }
@@ -512,10 +516,13 @@ public class SimpleAuthorizationSettingService extends GenericEntityService<Auth
             permission.setId(per);
             permission.setName(entity.getName());
             permission.setActions(all.stream()
+                    .filter(preActionPredicate)
                     .map(ParentPermission::getActions)
-                    .filter(Objects::nonNull)
                     .flatMap(Collection::stream)
                     .collect(Collectors.toSet()));
+            if (isEmpty(permission.getActions())) {
+                return;
+            }
             permissions.add(permission);
         });
         parentsPermissions.clear();