本篇文章的主要内容是通过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的用户发送到这个路径的请求才能被放行处理。这样就特别灵活。