refactor: 优化权限注解

This commit is contained in:
zhouhao
2025-06-13 14:32:05 +08:00
parent 9e2aa16747
commit c8e5eaf0e7
9 changed files with 31 additions and 128 deletions

View File

@@ -17,12 +17,10 @@ import java.util.stream.Stream;
public class AopAuthorizeDefinitionParser {
private static final Set<Class<? extends Annotation>> types = new HashSet<>(Arrays.asList(
Authorize.class,
DataAccess.class,
Dimension.class,
Resource.class,
ResourceAction.class,
DataAccessType.class
Authorize.class,
Dimension.class,
Resource.class,
ResourceAction.class
));
private final Set<Annotation> methodAnnotation;
@@ -45,12 +43,12 @@ public class AopAuthorizeDefinitionParser {
classAnnotation = AnnotatedElementUtils.findAllMergedAnnotations(targetClass, types);
classAnnotationGroup = classAnnotation
.stream()
.collect(Collectors.groupingBy(Annotation::annotationType));
.stream()
.collect(Collectors.groupingBy(Annotation::annotationType));
methodAnnotationGroup = methodAnnotation
.stream()
.collect(Collectors.groupingBy(Annotation::annotationType));
.stream()
.collect(Collectors.groupingBy(Annotation::annotationType));
}
private void initClassAnnotation() {
@@ -78,73 +76,13 @@ public class AopAuthorizeDefinitionParser {
}
}
private void initClassDataAccessAnnotation() {
for (Annotation annotation : classAnnotation) {
if (annotation instanceof DataAccessType ||
annotation instanceof DataAccess) {
for (ResourceDefinition resource : definition.getResources().getResources()) {
for (ResourceActionDefinition action : resource.getActions()) {
if (annotation instanceof DataAccessType) {
definition.putAnnotation(action, (DataAccessType) annotation);
} else {
definition.putAnnotation(action, (DataAccess) annotation);
}
}
}
}
}
}
private void initMethodDataAccessAnnotation() {
for (Annotation annotation : methodAnnotation) {
if (annotation instanceof ResourceAction) {
getAnnotationByType(Resource.class)
.map(res -> definition.getResources().getResource(res.id()).orElse(null))
.filter(Objects::nonNull)
.forEach(res -> {
ResourceAction ra = (ResourceAction) annotation;
ResourceActionDefinition action = definition.putAnnotation(res, ra);
getAnnotationByType(DataAccessType.class)
.findFirst()
.ifPresent(dat -> definition.putAnnotation(action, dat));
});
}
Optional<ResourceActionDefinition> actionDefinition = getAnnotationByType(Resource.class)
.map(res -> definition.getResources().getResource(res.id()).orElse(null))
.filter(Objects::nonNull)
.flatMap(res -> getAnnotationByType(ResourceAction.class)
.map(ra -> res.getAction(ra.id())
.orElse(null))
)
.filter(Objects::nonNull)
.findFirst();
if (annotation instanceof DataAccessType) {
actionDefinition.ifPresent(ra -> definition.putAnnotation(ra, (DataAccessType) annotation));
}
if (annotation instanceof DataAccess) {
actionDefinition.ifPresent(ra -> {
definition.putAnnotation(ra, (DataAccess) annotation);
getAnnotationByType(DataAccessType.class)
.findFirst()
.ifPresent(dat -> definition.putAnnotation(ra, dat));
});
}
}
}
AopAuthorizeDefinition parse() {
//没有任何注解
if (CollectionUtils.isEmpty(classAnnotation) && CollectionUtils.isEmpty(methodAnnotation)) {
return EmptyAuthorizeDefinition.instance;
}
initClassAnnotation();
initClassDataAccessAnnotation();
initMethodAnnotation();
initMethodDataAccessAnnotation();
return definition;
}
@@ -152,9 +90,9 @@ public class AopAuthorizeDefinitionParser {
private <T extends Annotation> Stream<T> getAnnotationByType(Class<T> type) {
return Optional.ofNullable(methodAnnotationGroup.getOrDefault(type, classAnnotationGroup.get(type)))
.map(Collection::stream)
.orElseGet(Stream::empty)
.map(type::cast);
.map(Collection::stream)
.orElseGet(Stream::empty)
.map(type::cast);
}
}

View File

@@ -55,15 +55,6 @@ public class DefaultBasicAuthorizeDefinition implements AopAuthorizeDefinition {
return allowAnonymous;
}
private static final Set<Class<? extends Annotation>> types = new HashSet<>(Arrays.asList(
Authorize.class,
DataAccess.class,
Dimension.class,
Resource.class,
ResourceAction.class,
DataAccessType.class
));
public static AopAuthorizeDefinition from(Class<?> targetClass, Method method) {
AopAuthorizeDefinitionParser parser = new AopAuthorizeDefinitionParser(targetClass, method);
@@ -121,37 +112,12 @@ public class DefaultBasicAuthorizeDefinition implements AopAuthorizeDefinition {
actionDefinition.setId(ann.id());
actionDefinition.setName(ann.name());
actionDefinition.setDescription(String.join("\n", ann.description()));
for (DataAccess dataAccess : ann.dataAccess()) {
putAnnotation(actionDefinition, dataAccess);
}
definition.addAction(actionDefinition);
return actionDefinition;
}
public void putAnnotation(ResourceActionDefinition definition, DataAccess ann) {
if (ann.ignore()) {
return;
}
DataAccessTypeDefinition typeDefinition = new DataAccessTypeDefinition();
for (DataAccessType dataAccessType : ann.type()) {
if (dataAccessType.ignore()) {
continue;
}
typeDefinition.setId(dataAccessType.id());
typeDefinition.setName(dataAccessType.name());
typeDefinition.setController(dataAccessType.controller());
typeDefinition.setConfiguration(dataAccessType.configuration());
typeDefinition.setDescription(String.join("\n", dataAccessType.description()));
}
if (ObjectUtils.isEmpty(typeDefinition.getId())) {
return;
}
definition.getDataAccess()
.getDataAccessTypes()
.add(typeDefinition);
}
public void putAnnotation(ResourceActionDefinition definition, DataAccessType dataAccessType) {
if (dataAccessType.ignore()) {
return;