首页 > 编程 > Java > 正文

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

2019-11-26 08:59:03
字体:
来源:转载
供稿:网友

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)@Documentedpublic @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@Componentpublic 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既可

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表