mirror of
https://github.com/hs-web/hsweb-framework.git
synced 2026-05-13 00:28:59 +08:00
refactor: 优化权限注解
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user