本文最后更新于2 分钟前,文中所描述的信息可能已发生改变。
原理
利用的aop对访问的放法进行拦截,然后再利用连接点参数获取方法上的注解以及注解元数据来进行权限校验,通过则让方法执行,不通过则抛出异常让全局异常处理进行捕获处理。
导入需要的依赖项
xml
<!--工程为springboot工程-->
<!--其他依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!--或者以下依賴,被上面的依賴包含了-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.4</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
编写自定义注解类
java
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Role {
String[] value();
}
编写切面类对需要拦截的资源进行访问拦截
java
@Component
@Aspect
public class RoleAop {
@Pointcut("@annotation(org.ecjtu.Role)")
public void pointCut(){}//切点,即被注解Role标记了的地方
@Around("pointCut()")//环绕通知
public Object checkRole(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
//通过连接点获取切点上的签名,即方法签名
MethodSignature signature = (MethodSignature)
proceedingJoinPoint.getSignature();
//获取被拦截的方法(可以判断拦截的是否是方法,如果是静态资源则放行)并获取方法上的注解
Role annotation = signature.getMethod().getAnnotation(Role.class);
//获取注解中的值
String[] value = annotation.value();
if(!"admin".equals(value[0])){
throw new RuntimeException("权限不足");
}
//放行
return proceedingJoinPoint.proceed();
}
}
在需要进行权限校验的方法资源上加上注解
java
@RestController
public class UserController {
@GetMapping("/test")
@Role("user")
public String test(){
System.out.println("您有权");
return "OK";
}
}