前言
之前写过AOP切面的详细解读以及通过AOP切面来进行操作日志的入库,本篇主要通过AOP切面来达到校验权限的目的
这是之前文章的链接
1、Spring boot 项目(五)——AOP切面:https://blog.csdn.net/weixin_45974176/article/details/120365438
2、Spring boot 项目(五)——AOP操作日志:https://blog.csdn.net/weixin_45974176/article/details/120374829
操作流程
1、新建权限校验注解
@Target(ElementType.METHOD) // 该注解可以作用于那些类型元素上:类、方法、字段
@Retention(RetentionPolicy.RUNTIME) // 运行时生效
public @interface PreAuth {
//权限字符串
String value() default "";
}
2、新建权限校验切面
@Aspect
@Component
@Slf4j
@Order(1)
public class PreAuthAspect {
@Pointcut("@annotation(com.qcby.informationsystem.anno.PreAuth)")
public void preAuthCut() {
}
@Resource
private SysUserMapper sysUserMapper;
@Resource
private HttpServletRequest request;
/**
* 可控制目标函数是否执行
*/
@Around("preAuthCut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("进入权限验证切面");
//从切面织入点处通过反射机制获取织入点处的方法
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
//获取切入点所在的方法
Method method = signature.getMethod();
//获取注解信息
PreAuth preAuth = method.getAnnotation(PreAuth.class);
// String nameValue = selfLog.name();
// log.info("nameValue的值为:{}", nameValue);
// String name = null;
// //获取切入点方法参数
String object =preAuth.value();
log.info("obj**********"+object);
String token= request.getHeader("token");
Long id= Long.valueOf(JwtUtil.getAudience(token));
List<String> list=sysUserMapper.auth(id);
if(list.contains(object)){
log.info("权限校验通过");
log.info("结束权限验证切面");
return joinPoint.proceed();
}else{
log.info("结束权限验证切面");
return ResultJson.error("您没有该权限");
}
}
}
3、controller层的方法上
@PreAuth("login:updatePassword")
@RequestMapping("updatePassword")
public void updatePassword(){}
4、结果
校验成功:
校验失败: