From 41c17c858b48f5080ebe1202398fbca264fadd5a Mon Sep 17 00:00:00 2001 From: zhouhao Date: Fri, 20 Jun 2025 19:09:57 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E6=9D=83?= =?UTF-8?q?=E9=99=90=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../define/ResourceActionDefinition.java | 1 + .../define/AopAuthorizeDefinitionParser.java | 17 ++- .../service/PermissionSynchronization.java | 104 ++++++------------ 3 files changed, 46 insertions(+), 76 deletions(-) diff --git a/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/ResourceActionDefinition.java b/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/ResourceActionDefinition.java index b09339916..e0272c656 100644 --- a/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/ResourceActionDefinition.java +++ b/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/ResourceActionDefinition.java @@ -26,6 +26,7 @@ public class ResourceActionDefinition implements MultipleI18nSupportEntity { private Map> i18nMessages; + @Deprecated private DataAccessDefinition dataAccess = new DataAccessDefinition(); diff --git a/hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/define/AopAuthorizeDefinitionParser.java b/hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/define/AopAuthorizeDefinitionParser.java index d87edbee2..0bcc2b151 100644 --- a/hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/define/AopAuthorizeDefinitionParser.java +++ b/hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/define/AopAuthorizeDefinitionParser.java @@ -73,6 +73,14 @@ public class AopAuthorizeDefinitionParser { if (annotation instanceof Dimension) { definition.putAnnotation(((Dimension) annotation)); } + if (annotation instanceof ResourceAction) { + getAnnotationByType(Resource.class) + .map(res -> definition.getResources().getResource(res.id()).orElse(null)) + .filter(Objects::nonNull) + .forEach(res -> { + definition.putAnnotation(res, (ResourceAction) annotation); + }); + } } } @@ -89,10 +97,11 @@ public class AopAuthorizeDefinitionParser { private Stream getAnnotationByType(Class type) { - return Optional.ofNullable(methodAnnotationGroup.getOrDefault(type, classAnnotationGroup.get(type))) - .map(Collection::stream) - .orElseGet(Stream::empty) - .map(type::cast); + return Optional + .ofNullable(methodAnnotationGroup.getOrDefault(type, classAnnotationGroup.get(type))) + .stream() + .flatMap(Collection::stream) + .map(type::cast); } } diff --git a/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/PermissionSynchronization.java b/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/PermissionSynchronization.java index a091a9720..150ddfa1d 100644 --- a/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/PermissionSynchronization.java +++ b/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/PermissionSynchronization.java @@ -43,82 +43,42 @@ public class PermissionSynchronization implements CommandLineRunner { @EventListener public void handleResourceParseEvent(AuthorizeDefinitionInitializedEvent event) { definition.merge(event.getAllDefinition()); - for (AuthorizeDefinition authorizeDefinition : event.getAllDefinition()) { - if (authorizeDefinition.getResources().getResources().isEmpty()) { - continue; - } - String id = authorizeDefinition.getResources().getResources().iterator().next().getId(); - if (entityFieldsMapping.containsKey(id)) { - return; - } - if (authorizeDefinition instanceof AopAuthorizeDefinition) { - Class target = ((AopAuthorizeDefinition) authorizeDefinition).getTargetClass(); - if (ReactiveQueryController.class.isAssignableFrom(target) - || ReactiveServiceQueryController.class.isAssignableFrom(target)) { - Class entity = ClassUtils.getGenericType(target); - if (Entity.class.isAssignableFrom(entity)) { - Set fields = new HashSet<>(); - ReflectionUtils.doWithFields(entity, field -> { - if (null != field.getAnnotation(Column.class) && !"id".equals(field.getName())) { - OptionalField optionalField = new OptionalField(); - optionalField.setName(field.getName()); - Optional.ofNullable(field.getAnnotation(Schema.class)) - .map(Schema::description) - .ifPresent(optionalField::setDescribe); - fields.add(optionalField); - } - }); - entityFieldsMapping.put(id, new ArrayList<>(fields)); - } - } - } - } } - public static PermissionEntity convert(Map old, ResourceDefinition definition, Map> entityFieldsMapping) { - PermissionEntity entity = old.getOrDefault(definition.getId(), PermissionEntity.builder() - .name(definition.getName()) - .describe(definition.getDescription()) - .i18nMessages(definition.getI18nMessages()) - .status((byte) 1) - .build()); + public static PermissionEntity convert(Map old, + ResourceDefinition definition, + Map> entityFieldsMapping) { + PermissionEntity entity = old.computeIfAbsent( + definition.getId(), + _id -> PermissionEntity + .builder() + .name(definition.getName()) + .describe(definition.getDescription()) + .i18nMessages(definition.getI18nMessages()) + .status((byte) 1) + .build()); entity.setId(definition.getId()); - if (CollectionUtils.isEmpty(entity.getOptionalFields())) { - entity.setOptionalFields(entityFieldsMapping.get(entity.getId())); - } + Map oldAction = new LinkedHashMap<>(); - Map oldAction = new HashMap<>(); if (entity.getActions() != null) { - entity.getActions().forEach(a -> oldAction.put(a.getAction(), a)); + for (ActionEntity action : entity.getActions()) { + oldAction.put(action.getAction(), action); + } } for (ResourceActionDefinition definitionAction : definition.getActions()) { ActionEntity action = oldAction.getOrDefault(definitionAction.getId(), ActionEntity - .builder() - .action(definitionAction.getId()) - .name(definitionAction.getName()) - .describe(definitionAction.getName()) - .build()); + .builder() + .action(definitionAction.getId()) + .name(definitionAction.getName()) + .describe(definitionAction.getName()) + .build()); action.setI18nMessages(definitionAction.getI18nMessages()); - Map properties = Optional.ofNullable(action.getProperties()).orElse(new HashMap<>()); - @SuppressWarnings("all") - Set types = (Set) Optional - .of(properties.computeIfAbsent("supportDataAccessTypes", t -> new HashSet<>())) - .filter(Collection.class::isInstance) - .map(Collection.class::cast) - .map(HashSet::new) - .orElseGet(HashSet::new); - types.addAll(definitionAction - .getDataAccess() - .getDataAccessTypes() - .stream() - .map(DataAccessTypeDefinition::getId) - .collect(Collectors.toSet())); - action.setProperties(properties); oldAction.put(action.getAction(), action); } + entity.setActions(new ArrayList<>(oldAction.values())); return entity; @@ -133,16 +93,16 @@ public class PermissionSynchronization implements CommandLineRunner { customizer.custom(definition); permissionRepository - .createQuery() - .fetch() - .collect(Collectors.toMap(PermissionEntity::getId, Function.identity())) - .flatMap(group -> Flux.fromIterable(definition.getResources()) - .map(d -> PermissionSynchronization.convert(group, d, entityFieldsMapping)) - .as(permissionRepository::save)) - .doOnError(err -> log.warn("sync permission error", err)) - .subscribe(l -> { - log.info("sync permission success:{}", l); - }); + .createQuery() + .fetch() + .collect(Collectors.toMap(PermissionEntity::getId, Function.identity())) + .flatMap(group -> Flux.fromIterable(definition.getResources()) + .map(d -> PermissionSynchronization.convert(group, d, entityFieldsMapping)) + .as(permissionRepository::save)) + .doOnError(err -> log.warn("sync permission error", err)) + .subscribe(l -> { + log.info("sync permission success:{}", l); + }); } }