|
@@ -47,63 +47,67 @@ public class AutoSyncPermission implements ApplicationListener<AuthorizeDefiniti
|
|
|
|
|
|
Map<String, List<AuthorizeDefinition>> grouping = new HashMap<>();
|
|
|
|
|
|
-
|
|
|
+ //以permissionId分组
|
|
|
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()) {
|
|
|
+ //创建权限实体
|
|
|
+ Map<String, PermissionEntity> waitToSyncPermissions = new HashMap<>();
|
|
|
+ for (Map.Entry<String, List<AuthorizeDefinition>> permissionDefinition : grouping.entrySet()) {
|
|
|
+ String permissionId = permissionDefinition.getKey();
|
|
|
+ //一个权限的全部定义(一个permission多个action)
|
|
|
+ List<AuthorizeDefinition> allDefinition = permissionDefinition.getValue();
|
|
|
+ if (allDefinition.isEmpty()) {
|
|
|
return;
|
|
|
}
|
|
|
- AuthorizeDefinition tmp = allPermission.get(0);
|
|
|
-
|
|
|
- List<String> descs = allPermission.stream()
|
|
|
+ AuthorizeDefinition tmp = allDefinition.get(0);
|
|
|
+ //action描述
|
|
|
+ List<String> actionDescription = allDefinition.stream()
|
|
|
.map(AuthorizeDefinition::getActionDescription)
|
|
|
.flatMap(Stream::of)
|
|
|
.collect(Collectors.toList());
|
|
|
-
|
|
|
- List<String> actions = allPermission
|
|
|
+ //action
|
|
|
+ List<String> actions = allDefinition
|
|
|
.stream()
|
|
|
.map(AuthorizeDefinition::getActions)
|
|
|
.flatMap(Collection::stream)
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
|
+ //创建action实体
|
|
|
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);
|
|
|
+ String desc = actionDescription.size() > i ? actionDescription.get(i) : actionDescMapping.getOrDefault(actions.get(i), action);
|
|
|
ActionEntity actionEntity = new ActionEntity();
|
|
|
actionEntity.setAction(action);
|
|
|
actionEntity.setDescribe(desc);
|
|
|
actionEntities.add(actionEntity);
|
|
|
}
|
|
|
}
|
|
|
+ //创建permission
|
|
|
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);
|
|
|
+ waitToSyncPermissions.putIfAbsent(entity.getId(), entity);
|
|
|
}
|
|
|
|
|
|
- Map<String, PermissionEntity> old = permissionService
|
|
|
- .selectByPk(new ArrayList<>(permissionEntityMap.keySet()))
|
|
|
+ //查询出全部旧的权限数据并载入缓存
|
|
|
+ Map<String, PermissionEntity> oldCache = permissionService
|
|
|
+ .select()
|
|
|
.stream()
|
|
|
.collect(Collectors.toMap(PermissionEntity::getId, Function.identity()));
|
|
|
|
|
|
- permissionEntityMap.forEach((permissionId, permission) -> {
|
|
|
+ waitToSyncPermissions.forEach((permissionId, permission) -> {
|
|
|
log.info("try sync permission[{}].{}", permissionId, permission.getActions());
|
|
|
- PermissionEntity oldPermission = old.get(permissionId);
|
|
|
+ PermissionEntity oldPermission = oldCache.get(permissionId);
|
|
|
if (oldPermission == null) {
|
|
|
permissionService.insert(permission);
|
|
|
} else {
|
|
@@ -115,6 +119,7 @@ public class AutoSyncPermission implements ApplicationListener<AuthorizeDefiniti
|
|
|
.stream().collect(Collectors.toMap(ActionEntity::getAction, Function.identity()));
|
|
|
boolean permissionChanged = false;
|
|
|
for (ActionEntity actionEntity : permission.getActions()) {
|
|
|
+ //添加新的action到旧的action
|
|
|
if (actionCache.get(actionEntity.getAction()) == null) {
|
|
|
oldAction.add(actionEntity);
|
|
|
permissionChanged = true;
|
|
@@ -122,12 +127,17 @@ public class AutoSyncPermission implements ApplicationListener<AuthorizeDefiniti
|
|
|
}
|
|
|
if (permissionChanged) {
|
|
|
oldPermission.setActions(oldAction);
|
|
|
-
|
|
|
permissionService.updateByPk(oldPermission.getId(), oldPermission);
|
|
|
}
|
|
|
+
|
|
|
+ actionCache.clear();
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
+ oldCache.clear();
|
|
|
+ waitToSyncPermissions.clear();
|
|
|
+ definitions.clear();
|
|
|
+ grouping.clear();
|
|
|
}
|
|
|
}
|