欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot使用AOP+注解實現(xiàn)簡單的權(quán)限驗證的方法

 更新時間:2019年05月29日 14:17:01   作者:wqh8522  
這篇文章主要介紹了SpringBoot使用AOP+注解實現(xiàn)簡單的權(quán)限驗證的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

SpringAOP的介紹:傳送門

demo介紹

主要通過自定義注解,使用SpringAOP的環(huán)繞通知攔截請求,判斷該方法是否有自定義注解,然后判斷該用戶是否有該權(quán)限。這里做的比較簡單,只有兩個權(quán)限:一個普通用戶、一個管理員。

項目搭建

這里是基于SpringBoot的,對于SpringBoot項目的搭建就不說了。在項目中添加AOP的依賴:<!--more--->

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

自定義注解及解析

在方法上添加該注解,說明該方法需要管理員權(quán)限才能訪問。

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

   String authorities() default "ADMIN";

}

解析類:通過AOP的環(huán)繞通知獲取方法上的注解,判斷是否有Permission注解,返回注解的值。

public class AnnotationParse {
  /***
   * 解析權(quán)限注解
   * @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環(huán)繞通知

@Aspect
@Component
public class ControllerAspect {

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

  @Autowired
  private UserService userService;
  /**
   * 定義切點(diǎn)
   */
  @Pointcut("execution(public * com.wqh.blog.controller.*.*(..))")
  public void privilege(){}

  /**
   * 權(quán)限環(huán)繞通知
   * @param joinPoint
   * @throws Throwable
   */
  @ResponseBody
  @Around("privilege()")
  public Object isAccessMethod(ProceedingJoinPoint joinPoint) throws Throwable {
    //獲取訪問目標(biāo)方法
    MethodSignature methodSignature = (MethodSignature)joinPoint.getSignature();
    Method targetMethod = methodSignature.getMethod();
    //得到方法的訪問權(quán)限
    final String methodAccess = AnnotationParse.privilegeParse(targetMethod);

    //如果該方法上沒有權(quán)限注解,直接調(diào)用目標(biāo)方法
    if(StringUtils.isBlank(methodAccess)){
      return joinPoint.proceed();
    }else {
      //獲取當(dāng)前用戶的權(quán)限,這里是自定義的發(fā)那個發(fā)
      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既可

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

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

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

    這篇文章主要介紹了Java中的@Cacheable注解的作用詳解, 使用 @Cacheable 注解就可以將運(yùn)行結(jié)果緩存,以后查詢相同的數(shù)據(jù),直接從緩存中取,不需要調(diào)用方法,需要的朋友可以參考下
    2023-10-10
  • 淺析Java中StringBuffer和StringBuilder的使用

    淺析Java中StringBuffer和StringBuilder的使用

    當(dāng)對字符串進(jìn)行修改的時候,需要使用 StringBuffer 和 StringBuilder 類。本文就來和大家簡單聊聊這二者的使用與區(qū)別吧,希望對大家有所幫助
    2023-04-04
  • 通過實踐了解如何處理Java異常

    通過實踐了解如何處理Java異常

    Java中的異常處理不是一個簡單的主題。初學(xué)者發(fā)現(xiàn)它很難理解,甚至有經(jīng)驗的開發(fā)者也可以花幾個小時討論如何以及應(yīng)該拋出或處理哪些異常。下面我們通過實踐來了解如何解決異常
    2019-05-05
  • MyBatis圖文并茂講解注解開發(fā)多對多查詢

    MyBatis圖文并茂講解注解開發(fā)多對多查詢

    這篇文章主要介紹了SpringBoot中Mybatis注解多對多查詢的實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • java正則表達(dá)式獲取url的host示例

    java正則表達(dá)式獲取url的host示例

    使用httpclient抓取頁面信息時需要填寫HOST,使用此正則提取抓取URL的HOST內(nèi)容
    2014-02-02
  • 并發(fā)編程之Java內(nèi)存模型順序一致性

    并發(fā)編程之Java內(nèi)存模型順序一致性

    這篇文章主要介紹了并發(fā)編程Java內(nèi)存模型順序一致性,順序一致性內(nèi)存模型是一個理論參考模型,處理器的內(nèi)存模型和編程語言的內(nèi)存模型都會以順序一致性內(nèi)存模型作為參照,下面我們一起進(jìn)入文章看看學(xué)校內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • Springboot項目啟動找不到啟動類的解決

    Springboot項目啟動找不到啟動類的解決

    這篇文章主要介紹了Springboot項目啟動找不到啟動類的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 細(xì)談java同步之JMM(Java Memory Model)

    細(xì)談java同步之JMM(Java Memory Model)

    Java內(nèi)存模型是在硬件內(nèi)存模型上的更高層的抽象,它屏蔽了各種硬件和操作系統(tǒng)訪問的差異性,保證了Java程序在各種平臺下對內(nèi)存的訪問都能達(dá)到一致的效果。下面我們來一起學(xué)習(xí)下JMM
    2019-05-05
  • Java Socket編程(三) 服務(wù)器Sockets

    Java Socket編程(三) 服務(wù)器Sockets

    Java Socket編程(三) 服務(wù)器Sockets...
    2006-12-12
  • Java線程狀態(tài)及同步鎖的操作方法

    Java線程狀態(tài)及同步鎖的操作方法

    Java中的thread類自帶有線程的一些方法,這些方法可以讓線程睡眠,插隊,提高線程調(diào)度的優(yōu)先級等等,它們提供了改變線程狀態(tài)的操作手段,這篇文章主要介紹了Java線程狀態(tài)及同步鎖,需要的朋友可以參考下
    2021-11-11

最新評論