SpringBoot使用AOP+注解实现简单的权限验证的方法

 更新时间:2019年05月29日 14:17:01   作者:wqh8522  
这篇文章主要介绍了SpringBoot使用AOP+注解实现简单的权限验证的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

SpringAOP的介绍:传送门

demo介绍

主要通过自定义注解,使用SpringAOP的环绕通知拦截请求,判断该方法是否有自定义注解,然后判断该用户是否有该权限。这里做的比较简单,只有两个权限:一个普通用户、一个管理员。

项目搭建

这里是基于SpringBoot的,对于SpringBoot项目的搭建就不说了。在项目中添加AOP的依赖:<!--more--->

<!--AOP包-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

自定义注解及解析

在方法上添加该注解,说明该方法需要管理员权限才能访问。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Permission {

   String authorities() default "ADMIN";

}

解析类:通过AOP的环绕通知获取方法上的注解,判断是否有Permission注解,返回注解的值。

public class AnnotationParse {
  /***
   * 解析权限注解
   * @return 返回注解的authorities值
   * @throws Exception
   */
  public static String privilegeParse(Method method) throws Exception {
    //获取该方法
    if(method.isAnnotationPresent(Permission.class)){
      Permission annotation = method.getAnnotation(Permission.class);
      return annotation.authorities();
    }
    return null;
  }
}

SpringAOP环绕通知

@Aspect
@Component
public class ControllerAspect {

  private final static Logger logger = LoggerFactory.getLogger(ControllerAspect.class);

  @Autowired
  private UserService userService;
  /**
   * 定义切点
   */
  @Pointcut("execution(public * com.wqh.blog.controller.*.*(..))")
  public void privilege(){}

  /**
   * 权限环绕通知
   * @param joinPoint
   * @throws Throwable
   */
  @ResponseBody
  @Around("privilege()")
  public Object isAccessMethod(ProceedingJoinPoint joinPoint) throws Throwable {
    //获取访问目标方法
    MethodSignature methodSignature = (MethodSignature)joinPoint.getSignature();
    Method targetMethod = methodSignature.getMethod();
    //得到方法的访问权限
    final String methodAccess = AnnotationParse.privilegeParse(targetMethod);

    //如果该方法上没有权限注解,直接调用目标方法
    if(StringUtils.isBlank(methodAccess)){
      return joinPoint.proceed();
    }else {
      //获取当前用户的权限,这里是自定义的发那个发
      User currentUser = userService.getCurrentUser();
      logger.info("访问用户,{}",currentUser.toString());
      if(currentUser == null){
        throw new LoginException(ResultEnum.LOGIN_ERROR);
      }
      if(methodAccess.equals(currentUser.getRole().toString())){
        return joinPoint.proceed();
      }else {
        throw new BusinessException(ResultEnum.ROLE_ERROR);
      }
    }
  }
}

使用

只需要在需要验证的方法上添加自定义注解: @Permission既可

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java中的@Cacheable注解的作用详解

    Java中的@Cacheable注解的作用详解

    这篇文章主要介绍了Java中的@Cacheable注解的作用详解, 使用 @Cacheable 注解就可以将运行结果缓存,以后查询相同的数据,直接从缓存中取,不需要调用方法,需要的朋友可以参考下
    2023-10-10
  • 浅析Java中StringBuffer和StringBuilder的使用

    浅析Java中StringBuffer和StringBuilder的使用

    当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。本文就来和大家简单聊聊这二者的使用与区别吧,希望对大家有所帮助
    2023-04-04
  • 通过实践了解如何处理Java异常

    通过实践了解如何处理Java异常

    Java中的异常处理不是一个简单的主题。初学者发现它很难理解,甚至有经验的开发者也可以花几个小时讨论如何以及应该抛出或处理哪些异常。下面我们通过实践来了解如何解决异常
    2019-05-05
  • MyBatis图文并茂讲解注解开发多对多查询

    MyBatis图文并茂讲解注解开发多对多查询

    这篇文章主要介绍了SpringBoot中Mybatis注解多对多查询的实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • java正则表达式获取url的host示例

    java正则表达式获取url的host示例

    使用httpclient抓取页面信息时需要填写HOST,使用此正则提取抓取URL的HOST内容
    2014-02-02
  • 并发编程之Java内存模型顺序一致性

    并发编程之Java内存模型顺序一致性

    这篇文章主要介绍了并发编程Java内存模型顺序一致性,顺序一致性内存模型是一个理论参考模型,处理器的内存模型和编程语言的内存模型都会以顺序一致性内存模型作为参照,下面我们一起进入文章看看学校内容,需要的朋友可以参考一下
    2021-11-11
  • Springboot项目启动找不到启动类的解决

    Springboot项目启动找不到启动类的解决

    这篇文章主要介绍了Springboot项目启动找不到启动类的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 细谈java同步之JMM(Java Memory Model)

    细谈java同步之JMM(Java Memory Model)

    Java内存模型是在硬件内存模型上的更高层的抽象,它屏蔽了各种硬件和操作系统访问的差异性,保证了Java程序在各种平台下对内存的访问都能达到一致的效果。下面我们来一起学习下JMM
    2019-05-05
  • Java Socket编程(三) 服务器Sockets

    Java Socket编程(三) 服务器Sockets

    Java Socket编程(三) 服务器Sockets...
    2006-12-12
  • Java线程状态及同步锁的操作方法

    Java线程状态及同步锁的操作方法

    Java中的thread类自带有线程的一些方法,这些方法可以让线程睡眠,插队,提高线程调度的优先级等等,它们提供了改变线程状态的操作手段,这篇文章主要介绍了Java线程状态及同步锁,需要的朋友可以参考下
    2021-11-11

最新评论