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

SpringBoot使用攔截器Interceptor實現(xiàn)統(tǒng)一角色權(quán)限校驗

 更新時間:2023年07月17日 09:02:53   作者:天罡gg  
角色權(quán)限校驗,是保證接口安全必備的能力:有權(quán)限才可以操作,所以,一般對于這種通用邏輯,推薦不與主業(yè)務(wù)邏輯耦合,那么怎么來解耦,那么本文小編就給大家詳細講解如何使用攔截器Interceptor實現(xiàn)統(tǒng)一角色權(quán)限校驗,需要的朋友可以參考下

一、定義注解annotation

通用功能定義在tg-book-common中

我們最終實現(xiàn)的效果是:加了@Role注解以后,這個接口只有管理員才能訪問,學生訪問接口就會報錯:無權(quán)限!

下面定義一個角色注解,通過@Target 指定作用于方法上。

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Role {
    /**
     * 角色id數(shù)組,默認1-管理員
     **/
    int[] roleIds() default { 1 };
}

定義roleIds,是保留擴展性。若后面擴展出【校長】等其它角色,我們可以通過int數(shù)組來任意組合角色,只要擁有int數(shù)組中的任意角色id即可訪問該接口。

二、攔截角色注解

1. 在攔截器哪里攔截?

顯然,首先需要【用戶身份認證】通過,然后再校驗角色!即在AuthInterceptorpreHandle的保存至授權(quán)上下文之前:AuthContextInfo.setAuthInfo(authInfo); 

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    。。。省略一大堆用戶身份認證代碼。。。
    // TODO 校驗角色:寫在這!
    // 校驗成功, 保存至認證上下文
    AuthContextInfo.setAuthInfo(authInfo);
    return true;
}

2. 如何攔截角色注解?

可以通過將handler轉(zhuǎn)成HandlerMethod以后,通過getAnnotation來獲??!

HandlerMethod handlerMethod = (HandlerMethod) handler;
Role role = handlerMethod.getMethod().getAnnotation(Role.class);
if (role != null) {
    // 走到這,說明方法上加了@Role
}

3. 角色如何讀取?

前2步以后,我們就拿到了當前登錄的userId,也拿到了接口要求的roleIds數(shù)組,所以至少有兩種方案:

  1. 可以通過userId去查一次MySQL,然后判斷一下角色,這種我就不實現(xiàn)了,你可以自己去查詢實現(xiàn)!
  2. 將roleId保存在token中!,本文實現(xiàn)的是另一種方案,是為了擴展一下大家的思路,也就是不走MySQL查詢的方案。

AuthContextInfo類中增加字段來承載角色:

private Integer roleId;

loginByPassword中將role設(shè)置到authContextInfo.roleId

authContextInfo.setRoleId(user.getRole());

接著在JwtTokenProvider中定義payload的自定義字段r:

// payload的自定義字段r
private static final String CLAIM_ROLE = "r";

在JwtTokenProvider.create中將它保存到token的payload中:

// 自定義 role
.withClaim(CLAIM_ROLE, authContextInfo.getRoleId())

在JwtTokenProvider.verify中將它從token中解析出來:

4. 最后做角色校驗

拿到了authInfo.getRoleId(),還知道了接口方法要求的roleIds,判斷邏輯太簡單了吧~ 我簡單寫了一下,如下:

// 校驗角色
HandlerMethod handlerMethod = (HandlerMethod) handler;
Role role = handlerMethod.getMethod().getAnnotation(Role.class);
if (role != null) {
    // 走到這,說明方法上加了@Role
    boolean isAdmin = false;
    for (int roleId : role.roleIds()) {
        if (authInfo.getRoleId().equals(roleId)) {
            isAdmin = true;
            break;
        }
    }
    if (!isAdmin) {
        log.info("[403]無權(quán)限, token={}", token);
        response.setStatus(HttpServletResponse.SC_FORBIDDEN);
        // 別忘了返回false
        return false;
    }
}

三、應用:給管理員操作接口加注解

在實現(xiàn)了通用校驗邏輯以后,接下來就是如何應用了!
其實就是:加@Role注解

下面對管理員錄入和修改圖書接口加了注解,其它接口同理~~

四、PostMan測試

使用role=0的賬號調(diào)用管理員API,返回403!

使用管理員賬號則會正常執(zhí)行!就不做截圖了!另外,別忘了提交Git!

以上就是SpringBoot使用攔截器Interceptor實現(xiàn)統(tǒng)一角色權(quán)限校驗的詳細內(nèi)容,更多關(guān)于SpringBoot Interceptor統(tǒng)一角色權(quán)限校驗的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java 使用json-lib處理JSON詳解及實例代碼

    Java 使用json-lib處理JSON詳解及實例代碼

    這篇文章主要介紹了Java 使用json-lib處理JSON詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • MyBatis延遲加載實現(xiàn)步驟詳解

    MyBatis延遲加載實現(xiàn)步驟詳解

    這篇文章主要介紹了MyBatis延遲加載實現(xiàn)步驟詳解,? MyBatis中的延遲加載,也成為懶加載,是指在進行關(guān)聯(lián)查詢時,按照設(shè)置的延遲規(guī)則推遲對關(guān)聯(lián)對象的查詢,延遲加載可以有效的減少數(shù)據(jù)庫的壓力,需要的朋友可以參考下
    2023-10-10
  • logback的ShutdownHook關(guān)閉原理解析

    logback的ShutdownHook關(guān)閉原理解析

    這篇文章主要為大家介紹了logback的ShutdownHook關(guān)閉原理源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • Java?retainAll()方法的超詳細講解

    Java?retainAll()方法的超詳細講解

    這篇文章主要介紹了Java?retainAll()方法的相關(guān)資料,retainAll()是Java集合接口中的一個方法,用于保留集合中與指定集合交集的元素,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-03-03
  • 關(guān)于IO密集型服務(wù)提升性能的三種方式

    關(guān)于IO密集型服務(wù)提升性能的三種方式

    這篇文章主要介紹了關(guān)于IO密集型服務(wù)提升性能的三種方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 分享幾個提高Java性能的高效用法

    分享幾個提高Java性能的高效用法

    這篇文章主要介紹了分享幾個提高Java性能的高效用法 ,需要的朋友可以參考下
    2014-10-10
  • 細數(shù)Java接口的概念、分類及與抽象類的區(qū)別

    細數(shù)Java接口的概念、分類及與抽象類的區(qū)別

    下面小編就為大家?guī)硪黄殧?shù)Java接口的概念、分類及與抽象類的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • 使用IDEA打jar包的詳細圖文教程

    使用IDEA打jar包的詳細圖文教程

    JAR文件是一種壓縮文件,與常見的ZIP壓縮文件兼容,被稱為JAR包,下面這篇文章主要給大家介紹了關(guān)于使用IDEA打jar包的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • Java 中運行字符串表達式的方法

    Java 中運行字符串表達式的方法

    這篇文章主要介紹了Java 中運行字符串表達式的方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-11-11
  • Mybatis攔截器實現(xiàn)分頁

    Mybatis攔截器實現(xiàn)分頁

    本文介紹使用Mybatis攔截器,實現(xiàn)分頁;并且在dao層,直接返回自定義的分頁對象。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-01-01

最新評論