@Documented
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface AccessAuth {
UserTypeEnum[] value() default {UserTypeEnum.EMPLOYEE, UserTypeEnum.DT_USER, UserTypeEnum.PARTNER_USER};
}
--获取类上的注解值
@Aspect
@Component
@Order(2)
@Slf4j
public class AccessAuthAspect {
@Autowired
private HttpServletRequest req;
@Pointcut(value = "(@within(com.dahuatech.service.b2b.core.annotation.AccessAuth) || @annotation(com.dahuatech.service.b2b.core.annotation.AccessAuth)) && execution( * com.dahuatech.b2b.dt.controller.*..*(..))")
public void b2bPermissionPointCut() {
}
@Around("b2bPermissionPointCut()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
// 判断是否有权限访问
Class<?> aClass = joinPoint.getTarget().getClass();
// 权限数组
UserTypeEnum[] userTypes = new UserTypeEnum[0];
// 判断是否有类注解
if (aClass.isAnnotationPresent(AccessAuth.class)) {
AccessAuth classAccessAuth = aClass.getAnnotation(AccessAuth.class);
userTypes = classAccessAuth.value();
}
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
if (method.isAnnotationPresent(AccessAuth.class)) {
// 有该注解,判断是否有权限
AccessAuth annotation = method.getAnnotation(AccessAuth.class);
userTypes = annotation.value();
}
// 如果没有该注解,则默认通过
if (userTypes.length <= 0) {
return joinPoint.proceed();
}
// 是否验证通过
if (!validate(userTypes)) {
throw new BizException(I18ReturnCode.NOT_PERMISSION);
}
return joinPoint.proceed();
}
private boolean validate(UserTypeEnum[] userTypes) {
// 验证是否有权限访问该接口
Object userType = req.getAttribute("userType");
UserTypeEnum userTypeEnum = Arrays.stream(userTypes)
.filter(p -> p.type.equals(userType))
.findAny()
.orElse(null);
return ObjectUtil.isNotEmpty(userTypeEnum);
}