239 字
1 分钟
自定义注解鉴权

在Service层里鉴权固然方便,也是我一直使用的方式,但是,如果我需要级联调用service,就会导致重复鉴权,这一点是没必要的,所以打算把鉴权提取出来。
开始
1. 注解
创建一个注解类
@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD, ElementType.TYPE})@Documentedpublic @interface RequirePermission { Role[] value();}注意这个Role是一个权限的枚举类
2. 在Controller打上注解
可以在类上注解
@RequirePermission({Role.systemAdministrator})public class UniversityController也可以在方法上注解
@RequirePermission({Role.systemAdministrator}) @ApiOperation("登陆接口") @PostMapping("/login") public Response<LoginResultVO> login(@RequestBody LoginForm loginForm)3. 在AOP中解析
定义切点
@Pointcut("@within(*.api.annotation.RequirePermission) || @annotation(*.api.annotation.RequirePermission)") public void permissionCheck() {}定义方法
@Around("permissionCheck()") public Object checkPermission(ProceedingJoinPoint joinPoint) throws Throwable { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod();
RequirePermission methodAnnotation = AnnotationUtils.findAnnotation(method, RequirePermission.class);
// 获取类上的注解 RequirePermission classAnnotation = AnnotationUtils.findAnnotation(method.getDeclaringClass(), RequirePermission.class);
// 优先使用方法上的注解,如果没有则使用类上的注解 Role[] requiredRoles = methodAnnotation != null ? methodAnnotation.value() : classAnnotation != null ? classAnnotation.value() : new Role[0]; //TODO: 权限校验
return joinPoint.proceed(); }分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续浏览
换条路线
从其他文章中稳定抽取
最后更新于 ,距今已过 605 天
部分内容可能已过时