type
status
date
slug
summary
tags
category
icon
password
前言:
某些控制器的方法是不能给大家随便访问的,那么可不可以通过JWT的token和AOP还有自定义注解来实现一个权限控制?
在现代Web应用中,确保不同用户拥有不同的访问权限是至关重要的。为了实现这一目标,可以通过结合JWT(JSON Web Token)、AOP(面向切面编程)以及自定义注解来构建一个灵活的权限控制系统。这种方法不仅提高了代码的可维护性和可读性,还能有效地控制不同用户对控制器方法的访问权限。
用JWT,AOP切面和自定义注解做一个Springboot权限控制
过程
第一步 引入相关依赖
pom.xml
引入依赖第二步 新建一个自定义注解

@Target(ElementType.METHOD)@Target 是一个元注解(meta-annotation),用于指定自定义注解可以用于哪些元素上。元注解是指用来定义其他注解的注解。ElementType.METHOD 表示该注解可以应用于方法元素上。这意味着 CheckPermission 注解只能被用在类的方法上,而不能用于类、字段、参数等其他元素。@Retention(RetentionPolicy.RUNTIME)@Retention 是另一个元注解,用于指定自定义注解在什么级别保留其信息。RetentionPolicy.RUNTIME 表示该注解的信息在运行时会被保留在 JVM 中,可以通过反射机制访问到。这意味着在程序运行时,可以通过注解处理器来检查和使用 CheckPermission 注解的信息,这对于需要在运行时进行权限检查的场景非常有用。
第三步 自定义异常类处理权限不足异常
创建一个自定义异常类
UnauthorizedException
,用于在权限校验失败时抛出异常。
第四步 对注解进行切面
定义一个前置通知,它会在所有带有
@CheckPermission
注解的方法执行之前先执行 checkPermission
方法从request里面获取jwt的token然后根据之前生成token时写入中间部分的用户信息判断用户的权限

- 切点定义:
使用@Pointcut注解定义切点,匹配所有带有
@CheckPermission注解
的方法。
环绕通知:
使用@Around注解定义一个环绕通知,在方法执行前后进行权限校验。
从当前请求中获取HTTP请求对象。
从请求头中获取JWT token,并进行基本的格式校验。
使用JWT密钥解析token,提取用户信息。
获取当前方法的@CheckPermission注解值,提取所需的权限信息。
从JWT中提取用户的权限信息,并与所需的权限进行比较。
如果权限不足,则抛出UnauthorizedException异常;否则,继续执行目标方法。

第五步 在需要加权限校验的控制器方法前加上注解
例如:在删除用户操作前加上权限校验

总结
通过结合Spring Boot的AOP特性、自定义注解以及JWT,我们实现了一个高效的权限控制系统。以下是主要步骤的总结:
1.引入依赖:在pom.xml中添加Spring Boot AOP和JWT相关的依赖。
2.创建自定义注解:@CheckPermission用于标记需要权限校验的方法。
3.定义异常类:创建PermissionException用于处理权限不足的情况。
4.实现切面:定义一个切面类PermissionAspect,在带有@CheckPermission注解的方法执行前进行权限校验。
5.应用注解:在需要权限控制的控制器方法上添加@CheckPermission注解,指定所需的权限标识。
不仅简化了权限控制的实现过程,还提高了代码的可维护性和可扩展性。通过这种方式,可以灵活地管理不同用户的访问权限,确保应用的安全性。
有关本文或者使用上的问题,欢迎您在底部评论区留言,一起交流~

- 作者:上玄
- 链接:http://passvip.top/article/6
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。