mirror of
https://github.com/continew-org/continew-starter.git
synced 2025-09-15 04:57:42 +08:00
feat(crud): CrudRequestMapping 注解增加 ignoreAuth、ignorePermission 支持
This commit is contained in:
@@ -23,6 +23,8 @@ import java.lang.annotation.*;
|
|||||||
/**
|
/**
|
||||||
* CRUD(增删改查)API
|
* CRUD(增删改查)API
|
||||||
*
|
*
|
||||||
|
* <p>{@link CrudRequestMapping#apis} 优先级高于方法上的 @CrudApi</p>
|
||||||
|
*
|
||||||
* @author Charles7c
|
* @author Charles7c
|
||||||
* @since 2.7.5
|
* @since 2.7.5
|
||||||
*/
|
*/
|
||||||
@@ -35,4 +37,14 @@ public @interface CrudApi {
|
|||||||
* API 类型
|
* API 类型
|
||||||
*/
|
*/
|
||||||
Api value() default Api.LIST;
|
Api value() default Api.LIST;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否忽略认证
|
||||||
|
*/
|
||||||
|
boolean ignoreAuth() default false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否忽略权限校验
|
||||||
|
*/
|
||||||
|
boolean ignorePermission() default false;
|
||||||
}
|
}
|
||||||
|
@@ -36,8 +36,26 @@ public @interface CrudRequestMapping {
|
|||||||
*/
|
*/
|
||||||
String value() default "";
|
String value() default "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* API 列表
|
||||||
|
* <p>优先级高于 {@link #api}</p>
|
||||||
|
*/
|
||||||
|
CrudApi[] apis() default {};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* API 列表
|
* API 列表
|
||||||
*/
|
*/
|
||||||
Api[] api() default {Api.PAGE, Api.GET, Api.CREATE, Api.UPDATE, Api.DELETE, Api.EXPORT};
|
Api[] api() default {Api.PAGE, Api.GET, Api.CREATE, Api.UPDATE, Api.DELETE, Api.EXPORT};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否忽略认证
|
||||||
|
* <p>全部忽略,优先级低于 {@link CrudApi#ignoreAuth}</p>
|
||||||
|
*/
|
||||||
|
boolean ignoreAuth() default false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否忽略权限校验
|
||||||
|
* <p>全部忽略,优先级低于 {@link CrudApi#ignorePermission}</p>
|
||||||
|
*/
|
||||||
|
boolean ignorePermission() default false;
|
||||||
}
|
}
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package top.continew.starter.extension.crud.aop;
|
package top.continew.starter.extension.crud.aop;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.ArrayUtil;
|
||||||
import org.aopalliance.intercept.MethodInterceptor;
|
import org.aopalliance.intercept.MethodInterceptor;
|
||||||
import org.aopalliance.intercept.MethodInvocation;
|
import org.aopalliance.intercept.MethodInvocation;
|
||||||
import org.springframework.aop.support.AopUtils;
|
import org.springframework.aop.support.AopUtils;
|
||||||
@@ -23,9 +24,11 @@ import org.springframework.core.BridgeMethodResolver;
|
|||||||
import org.springframework.core.annotation.AnnotatedElementUtils;
|
import org.springframework.core.annotation.AnnotatedElementUtils;
|
||||||
import org.springframework.util.ClassUtils;
|
import org.springframework.util.ClassUtils;
|
||||||
import top.continew.starter.extension.crud.annotation.CrudApi;
|
import top.continew.starter.extension.crud.annotation.CrudApi;
|
||||||
|
import top.continew.starter.extension.crud.annotation.CrudRequestMapping;
|
||||||
import top.continew.starter.extension.crud.controller.AbstractCrudController;
|
import top.continew.starter.extension.crud.controller.AbstractCrudController;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -44,10 +47,28 @@ public class CrudApiAnnotationInterceptor implements MethodInterceptor {
|
|||||||
Method specificMethod = ClassUtils.getMostSpecificMethod(invocation.getMethod(), targetClass);
|
Method specificMethod = ClassUtils.getMostSpecificMethod(invocation.getMethod(), targetClass);
|
||||||
Method targetMethod = BridgeMethodResolver.findBridgedMethod(specificMethod);
|
Method targetMethod = BridgeMethodResolver.findBridgedMethod(specificMethod);
|
||||||
// 获取 @CrudApi 注解
|
// 获取 @CrudApi 注解
|
||||||
CrudApi crudApi = AnnotatedElementUtils.findMergedAnnotation(targetMethod, CrudApi.class);
|
CrudApi crudApi = this.getCrudApi(targetMethod, targetClass);
|
||||||
// 执行处理
|
// 执行处理
|
||||||
AbstractCrudController crudController = (AbstractCrudController)invocation.getThis();
|
AbstractCrudController crudController = (AbstractCrudController)invocation.getThis();
|
||||||
crudController.preHandle(crudApi, invocation.getArguments(), targetMethod, targetClass);
|
crudController.preHandle(crudApi, invocation.getArguments(), targetMethod, targetClass);
|
||||||
return invocation.proceed();
|
return invocation.proceed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取 @CrudApi 注解
|
||||||
|
*
|
||||||
|
* @param targetMethod 目标方法
|
||||||
|
* @param targetClass 目标类
|
||||||
|
* @return @CrudApi 注解
|
||||||
|
*/
|
||||||
|
private CrudApi getCrudApi(Method targetMethod, Class<?> targetClass) {
|
||||||
|
CrudRequestMapping crudRequestMapping = AnnotatedElementUtils
|
||||||
|
.findMergedAnnotation(targetClass, CrudRequestMapping.class);
|
||||||
|
CrudApi[] crudApis = crudRequestMapping.apis();
|
||||||
|
CrudApi crudApi = AnnotatedElementUtils.findMergedAnnotation(targetMethod, CrudApi.class);
|
||||||
|
if (ArrayUtil.isEmpty(crudApis)) {
|
||||||
|
return crudApi;
|
||||||
|
}
|
||||||
|
return Arrays.stream(crudApis).filter(api -> api.value() == crudApi.value()).findFirst().orElse(null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -31,6 +31,7 @@ import top.continew.starter.extension.crud.enums.Api;
|
|||||||
|
|
||||||
import java.lang.reflect.AnnotatedElement;
|
import java.lang.reflect.AnnotatedElement;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CRUD 请求映射器处理器映射器
|
* CRUD 请求映射器处理器映射器
|
||||||
@@ -51,10 +52,10 @@ public class CrudRequestMappingHandlerMapping extends RequestMappingHandlerMappi
|
|||||||
return requestMappingInfo;
|
return requestMappingInfo;
|
||||||
}
|
}
|
||||||
CrudRequestMapping crudRequestMapping = handlerType.getDeclaredAnnotation(CrudRequestMapping.class);
|
CrudRequestMapping crudRequestMapping = handlerType.getDeclaredAnnotation(CrudRequestMapping.class);
|
||||||
// 过滤 API,如果非本类中定义,且 API 列表中不包含,则忽略
|
|
||||||
Api[] apiArr = crudRequestMapping.api();
|
|
||||||
CrudApi crudApi = AnnotatedElementUtils.findMergedAnnotation(method, CrudApi.class);
|
CrudApi crudApi = AnnotatedElementUtils.findMergedAnnotation(method, CrudApi.class);
|
||||||
if (method.getDeclaringClass() != handlerType && !ArrayUtil.contains(apiArr, ExceptionUtils
|
// 过滤 API:如果非本类中定义,且 API 列表中不包含,则忽略
|
||||||
|
Api[] apis = this.getApis(crudRequestMapping);
|
||||||
|
if (method.getDeclaringClass() != handlerType && !ArrayUtil.contains(apis, ExceptionUtils
|
||||||
.exToNull(crudApi::value))) {
|
.exToNull(crudApi::value))) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -62,6 +63,29 @@ public class CrudRequestMappingHandlerMapping extends RequestMappingHandlerMappi
|
|||||||
return this.getMappingForMethodWrapper(method, handlerType, crudRequestMapping);
|
return this.getMappingForMethodWrapper(method, handlerType, crudRequestMapping);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取 API 列表
|
||||||
|
*
|
||||||
|
* @param crudRequestMapping CRUD 请求映射
|
||||||
|
* @return API 列表
|
||||||
|
*/
|
||||||
|
private Api[] getApis(CrudRequestMapping crudRequestMapping) {
|
||||||
|
Api[] apiArr = crudRequestMapping.api();
|
||||||
|
CrudApi[] crudApiArr = crudRequestMapping.apis();
|
||||||
|
if (ArrayUtil.isEmpty(crudApiArr)) {
|
||||||
|
return apiArr;
|
||||||
|
}
|
||||||
|
return Arrays.stream(crudApiArr).map(CrudApi::value).toArray(Api[]::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取请求映射信息
|
||||||
|
*
|
||||||
|
* @param method 方法
|
||||||
|
* @param handlerType 处理程序类型
|
||||||
|
* @param crudRequestMapping CRUD 请求映射
|
||||||
|
* @return 请求映射信息
|
||||||
|
*/
|
||||||
private RequestMappingInfo getMappingForMethodWrapper(@NonNull Method method,
|
private RequestMappingInfo getMappingForMethodWrapper(@NonNull Method method,
|
||||||
@NonNull Class<?> handlerType,
|
@NonNull Class<?> handlerType,
|
||||||
CrudRequestMapping crudRequestMapping) {
|
CrudRequestMapping crudRequestMapping) {
|
||||||
@@ -81,6 +105,12 @@ public class CrudRequestMappingHandlerMapping extends RequestMappingHandlerMappi
|
|||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构建请求映射信息
|
||||||
|
*
|
||||||
|
* @param element 元素
|
||||||
|
* @return 请求映射信息
|
||||||
|
*/
|
||||||
private RequestMappingInfo buildRequestMappingInfo(AnnotatedElement element) {
|
private RequestMappingInfo buildRequestMappingInfo(AnnotatedElement element) {
|
||||||
RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
|
RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
|
||||||
RequestCondition<?> condition = (element instanceof Class<?> clazz
|
RequestCondition<?> condition = (element instanceof Class<?> clazz
|
||||||
|
Reference in New Issue
Block a user