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

在Service层里鉴权固然方便,也是我一直使用的方式,但是,如果我需要级联调用service,就会导致重复鉴权,这一点是没必要的,所以打算把鉴权提取出来。

开始#

1. 注解#

创建一个注解类

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
@Documented
public @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();
}
自定义注解鉴权
https://blog.zhenxuna.cn/post/10/
作者
与你道晚安
发布于
2025-02-03
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续浏览

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取

最后更新于 ,距今已过 605 天

部分内容可能已过时