zhou-hao vor 5 Jahren
Ursprung
Commit
f777a4b00b

+ 10 - 10
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/system/authorization/api/entity/AuthorizationSettingEntity.java

@@ -32,23 +32,23 @@ public class AuthorizationSettingEntity implements Entity {
     @NotBlank(message = "权限ID不能为空",groups = CreateGroup.class)
     private String permission;
 
-    @Column(length = 32, nullable = false,updatable = false)
-    @Comment("维度")//如:user,role
+    @Column(name = "dimension_type",length = 32, nullable = false,updatable = false)
+    @Comment("维度类型")//如:user,role
     @NotBlank(message = "维度不能为空",groups = CreateGroup.class)
-    private String dimension;
+    private String dimensionType;
 
-    @Column(name = "dimension_name", length = 64)
-    @Comment("维度名称")//如:用户,角色
-    private String dimensionName;
+    @Column(name = "dimension_type_name", length = 64)
+    @Comment("维度类型名称")//如:用户,角色
+    private String dimensionTypeName;
 
-    @Column(name = "setting_target", length = 32, updatable = false)
+    @Column(name = "dimension_target", length = 32, updatable = false)
     @Comment("维度目标")//具体的某个维度实例ID
     @NotBlank(message = "维度目标不能为空",groups = CreateGroup.class)
-    private String settingTarget;
+    private String dimensionTarget;
 
-    @Column(name = "setting_target_name", length = 64, updatable = false)
+    @Column(name = "dimension_target_name", length = 64, updatable = false)
     @Comment("维度目标名称")//维度实例名称.如: 用户名. 角色名
-    private String settingTargetName;
+    private String dimensionTargetName;
 
     @Column(name = "state", nullable = false)
     @Comment("状态")

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

@@ -65,20 +65,24 @@ public class DefaultReactiveAuthenticationInitializeService
 
     }
 
+    protected Flux<AuthorizationSettingEntity> getSettings(List<Dimension> dimensions) {
+        return Flux.fromIterable(dimensions)
+                .groupBy(d -> d.getType().getId(), (Function<Dimension, Object>) Dimension::getId)
+                .flatMap(group -> group.collectList()
+                        .flatMapMany(list -> settingRepository
+                                .createQuery()
+                                .where(AuthorizationSettingEntity::getState, 1)
+                                .and(AuthorizationSettingEntity::getDimensionType, group.key())
+                                .in(AuthorizationSettingEntity::getDimensionTarget, list)
+                                .fetch()));
+    }
+
     protected Mono<Authentication> initPermission(SimpleAuthentication authentication) {
         return Flux.fromIterable(dimensionProviders)
                 .flatMap(provider -> provider.getDimensionByUserId(authentication.getUser().getId()))
                 .collectList()
                 .doOnNext(authentication::setDimensions)
-                .flatMap(allDimension -> Mono.zip(getAllPermission(),
-                        settingRepository
-                                .createQuery()
-                                .where(AuthorizationSettingEntity::getState, 1)
-                                .in(AuthorizationSettingEntity::getDimension, allDimension
-                                        .stream()
-                                        .map(Dimension::getId)
-                                        .collect(Collectors.toList()))
-                                .fetch()
+                .flatMap(allDimension -> Mono.zip(getAllPermission(), getSettings(allDimension)
                                 .collect(Collectors.groupingBy(AuthorizationSettingEntity::getPermission))
                         , (_p, _s) -> handlePermission(authentication, allDimension, _p, _s)));
 

+ 4 - 4
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/test/java/org/hswebframework/web/system/authorization/defaults/service/reactive/DefaultReactiveAuthenticationManagerTest.java

@@ -66,10 +66,10 @@ public class DefaultReactiveAuthenticationManagerTest {
                 .map(setting -> {
                     setting.setPermission("test");
                     setting.setActions(Collections.singleton("add"));
-                    setting.setDimension(entity.getId());
-                    setting.setDimensionName("测试用户");
-                    setting.setSettingTarget("admin");
-                    setting.setSettingTargetName("admin");
+                    setting.setDimensionType("user");
+                    setting.setDimensionTypeName("测试用户");
+                    setting.setDimensionTarget(entity.getId());
+                    setting.setDimensionTargetName("admin");
                     setting.setState((byte) 1);
                     return setting;
                 })