注解1

@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);
}
posted @ 2021-10-30 19:34  yydssc  阅读(25)  评论(0)    收藏  举报