Pārlūkot izejas kodu

增加自动同步权限到数据库,配置hsweb.authorize.sync=true生效

zhou-hao 7 gadi atpakaļ
vecāks
revīzija
b2a6ee510a

+ 7 - 8
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-starter/src/main/java/org/hswebframework/web/authorization/starter/AuthorizationAutoConfiguration.java

@@ -20,22 +20,15 @@ package org.hswebframework.web.authorization.starter;
 
 import org.hswebframework.web.authorization.AuthenticationInitializeService;
 import org.hswebframework.web.authorization.AuthenticationManager;
-import org.hswebframework.web.authorization.listener.AuthorizationListener;
-import org.hswebframework.web.authorization.listener.AuthorizationListenerDispatcher;
-import org.hswebframework.web.authorization.listener.event.AuthorizationEvent;
 import org.hswebframework.web.authorization.simple.DefaultAuthorizationAutoConfiguration;
 import org.hswebframework.web.service.authorization.simple.SimpleAuthenticationManager;
-import org.hswebframework.utils.ClassUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.AutoConfigureBefore;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
 
-import java.util.List;
-
 /**
  * @author zhouhao
  */
@@ -50,4 +43,10 @@ public class AuthorizationAutoConfiguration {
     public AuthenticationManager authenticationManager(AuthenticationInitializeService authenticationInitializeService) {
         return new SimpleAuthenticationManager(authenticationInitializeService);
     }
+
+    @Bean
+    @ConditionalOnProperty(prefix = "hsweb.authorize",name = "sync",havingValue = "true")
+    public AutoSyncPermission autoSyncPermission(){
+        return new AutoSyncPermission();
+    }
 }

+ 133 - 0
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-starter/src/main/java/org/hswebframework/web/authorization/starter/AutoSyncPermission.java

@@ -0,0 +1,133 @@
+package org.hswebframework.web.authorization.starter;
+
+import lombok.extern.slf4j.Slf4j;
+import org.hswebframework.web.authorization.Permission;
+import org.hswebframework.web.authorization.define.AuthorizeDefinition;
+import org.hswebframework.web.authorization.define.AuthorizeDefinitionInitializedEvent;
+import org.hswebframework.web.commons.entity.DataStatus;
+import org.hswebframework.web.commons.entity.factory.EntityFactory;
+import org.hswebframework.web.entity.authorization.ActionEntity;
+import org.hswebframework.web.entity.authorization.PermissionEntity;
+import org.hswebframework.web.service.authorization.PermissionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationListener;
+
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+@Slf4j
+public class AutoSyncPermission implements ApplicationListener<AuthorizeDefinitionInitializedEvent> {
+
+    @Autowired
+    private PermissionService permissionService;
+
+    @Autowired
+    private EntityFactory entityFactory;
+
+    private static Map<String, String> actionDescMapping = new HashMap<>();
+
+    static {
+        actionDescMapping.put(Permission.ACTION_QUERY, "查询");
+        actionDescMapping.put(Permission.ACTION_ADD, "新增");
+        actionDescMapping.put(Permission.ACTION_GET, "查看详情");
+        actionDescMapping.put(Permission.ACTION_UPDATE, "修改");
+        actionDescMapping.put(Permission.ACTION_DELETE, "删除");
+        actionDescMapping.put(Permission.ACTION_DISABLE, "禁用");
+        actionDescMapping.put(Permission.ACTION_ENABLE, "启用");
+        actionDescMapping.put(Permission.ACTION_EXPORT, "导出");
+        actionDescMapping.put(Permission.ACTION_IMPORT, "导入");
+
+    }
+
+    @Override
+    public void onApplicationEvent(AuthorizeDefinitionInitializedEvent event) {
+        List<AuthorizeDefinition> definitions = event.getAllDefinition();
+
+        Map<String, List<AuthorizeDefinition>> grouping = new HashMap<>();
+
+
+        for (AuthorizeDefinition definition : definitions) {
+            for (String permissionId : definition.getPermissions()) {
+                grouping.computeIfAbsent(permissionId, id -> new ArrayList<>())
+                        .add(definition);
+            }
+        }
+        Map<String, PermissionEntity> permissionEntityMap = new HashMap<>();
+
+        for (Map.Entry<String, List<AuthorizeDefinition>> permissionEntiry : grouping.entrySet()) {
+            String permissionId = permissionEntiry.getKey();
+            List<AuthorizeDefinition> allPermission = permissionEntiry.getValue();
+            if (allPermission.isEmpty()) {
+                return;
+            }
+            AuthorizeDefinition tmp = allPermission.get(0);
+
+            List<String> descs = allPermission.stream()
+                    .map(AuthorizeDefinition::getActionDescription)
+                    .flatMap(Stream::of)
+                    .collect(Collectors.toList());
+
+            List<String> actions = allPermission
+                    .stream()
+                    .map(AuthorizeDefinition::getActions)
+                    .flatMap(Collection::stream)
+                    .collect(Collectors.toList());
+
+            Set<ActionEntity> actionEntities = new HashSet<>(actions.size());
+            if (!actions.isEmpty()) {
+                for (int i = 0; i < actions.size(); i++) {
+                    String action = actions.get(i);
+                    String desc = descs.size() > i ? descs.get(i) : actionDescMapping.getOrDefault(actions.get(i), action);
+                    ActionEntity actionEntity = new ActionEntity();
+                    actionEntity.setAction(action);
+                    actionEntity.setDescribe(desc);
+                    actionEntities.add(actionEntity);
+                }
+            }
+            PermissionEntity entity = entityFactory.newInstance(PermissionEntity.class);
+            entity.setId(permissionId);
+            entity.setName(tmp.getPermissionDescription().length > 0 ? tmp.getPermissionDescription()[0] : permissionId);
+            entity.setActions(new ArrayList<>(actionEntities));
+            entity.setType("default");
+            entity.setStatus(DataStatus.STATUS_ENABLED);
+
+            permissionEntityMap.putIfAbsent(entity.getId(), entity);
+        }
+
+        Map<String, PermissionEntity> old = permissionService
+                .selectByPk(new ArrayList<>(permissionEntityMap.keySet()))
+                .stream()
+                .collect(Collectors.toMap(PermissionEntity::getId, Function.identity()));
+
+        permissionEntityMap.forEach((permissionId, permission) -> {
+            log.info("try sync permission[{}].{}", permissionId, permission.getActions());
+            PermissionEntity oldPermission = old.get(permissionId);
+            if (oldPermission == null) {
+                permissionService.insert(permission);
+            } else {
+                List<ActionEntity> oldAction = oldPermission.getActions();
+                if (oldAction == null) {
+                    oldAction = new ArrayList<>();
+                }
+                Map<String, ActionEntity> actionCache = oldAction
+                        .stream().collect(Collectors.toMap(ActionEntity::getAction, Function.identity()));
+                boolean permissionChanged = false;
+                for (ActionEntity actionEntity : permission.getActions()) {
+                    if (actionCache.get(actionEntity.getAction()) == null) {
+                        oldAction.add(actionEntity);
+                        permissionChanged = true;
+                    }
+                }
+                if (permissionChanged) {
+                    oldPermission.setActions(oldAction);
+
+                    permissionService.updateByPk(oldPermission.getId(), oldPermission);
+                }
+            }
+
+        });
+
+    }
+}

+ 1 - 0
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-starter/src/main/resources/hsweb-starter.js

@@ -66,6 +66,7 @@ function install(context) {
         .addColumn().name("spt_da_types").clob().comment("支持的数据权限类型").commit()
         .addColumn().name("optional_fields").clob().comment("可选字段").commit()
         .addColumn().name("parents").clob().comment("关联其他权限").commit()
+        .addColumn().name("type").varchar(128).comment("类型").commit()
         .comment("权限表").commit();
 
     database.createOrAlter("s_permission_role")