用JWT,AOP切面和自定义注解做一个Springboot权限控制
用JWT,AOP切面和自定义注解做一个Springboot权限控制
前言
某些控制器的方法是不能给大家随便访问的,那么可不可以通过JWT的token和AOP还有自定义注解来实现一个权限控制?
在现代Web应用中,确保不同用户拥有不同的访问权限是至关重要的。为了实现这一目标,可以通过结合JWT(JSON Web Token)、AOP(面向切面编程)以及自定义注解来构建一个灵活的权限控制系统。这种方法不仅提高了代码的可维护性和可读性,还能有效地控制不同用户对控制器方法的访问权限。
过程
第一步 引入相关依赖
pom.xml
引入依赖
<!-- Spring Boot AOP 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>3.3.5</version>
</dependency>
<!-- jwt-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<!--jwt依赖的依赖 -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
第二步 新建一个自定义注解
@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注解,指定所需的权限标识。
不仅简化了权限控制的实现过程,还提高了代码的可维护性和可扩展性。通过这种方式,可以灵活地管理不同用户的访问权限,确保应用的安全性。
原文地址:https://blog.csdn.net/qq_46144627/article/details/144678379
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!