SpringBoot AOP 简单的权限校验
本篇文章的主要内容是通过AOP切面编程实现简单的权限校验。
书接上回登录与注册功能
我们的用户表里面不是有role(权限)这个字段吗
在JWT令牌的生成中,我们加入了role字段。
那么接下来,我们就可以通过这个字段来实现权限校验。
我这里就很简单,只有一个Permission注解和一个PermissionAspect类
Permission
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
@Order(Ordered.HIGHEST_PRECEDENCE)
public @interface Permission {/*** 最小权限* @return*/int role() default 0;
}
PermissionAspect类:
@Slf4j
@Aspect
@Component
public class PermissionAspect {// 定义切点@Pointcut("within(@org.springframework.web.bind.annotation.RestController *) && @annotation(com.codehome.server.annotation.Permission)")public void autoPermissionPointcut(){}// 定义通知@Before("autoPermissionPointcut()")public void requirePermission(final JoinPoint joinPoint)throws PermissionException {log.info("权限校验开始");MethodSignature signature = (MethodSignature) joinPoint.getSignature();Permission permission = signature.getMethod().getAnnotation(Permission.class);Integer role = permission.role();if(BaseContext.getCurrentRole() >= role){log.info("权限校验通过");}else {throw new PermissionException("权限不足");}}
}
说明:在JWT令牌生成的时候我们存入了role,在JwtTokenAdminInterceptor拦截器中,我们将这个role取了出来并保存到了ThreadLocal中,所以在校验的时候,就通过这个role进行权限校验。
权限校验使用:
在Controller类中,我们在每个路径方法前加上我们写的注解@Permission(role=2)
,这个就代表着只有用户权限大于等于2的用户发送到这个路径的请求才能被放行处理。这样就特别灵活。