最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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注解以后,這個接口只有管理員才能訪問,學(xué)生訪問接口就會報錯:無權(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;
    }
}

三、應(yīng)用:給管理員操作接口加注解

在實現(xiàn)了通用校驗邏輯以后,接下來就是如何應(yīng)用了!
其實就是:加@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繪制五子棋棋盤

    java繪制五子棋棋盤

    這篇文章主要為大家詳細介紹了java繪制五子棋棋盤,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • 基于SpringBoot+AOP實現(xiàn)接口限流

    基于SpringBoot+AOP實現(xiàn)接口限流

    本文介紹了使用SpringBoot和AOP實現(xiàn)接口限流的方法,通過自定義注解、限流工具類、AOP切面等實現(xiàn)限流功能,支持多種限流策略、粒度和存儲方式,并提供了詳細的代碼示例和測試驗證方法,需要的朋友可以參考下
    2026-04-04
  • System.currentTimeMillis()計算方式與時間的單位轉(zhuǎn)換詳解

    System.currentTimeMillis()計算方式與時間的單位轉(zhuǎn)換詳解

    這篇文章主要介紹了System.currentTimeMillis()計算方式與時間的單位轉(zhuǎn)換詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2020-05-05
  • java 中死鎖問題的實例詳解

    java 中死鎖問題的實例詳解

    這篇文章主要介紹了java 中死鎖問題的實例詳解的相關(guān)資料,希望通過本文大家能夠理解掌握死鎖的問題,需要的朋友可以參考下
    2017-09-09
  • java實現(xiàn)簡單的小超市程序

    java實現(xiàn)簡單的小超市程序

    這篇文章主要為大家詳細介紹了java實現(xiàn)簡單的小超市程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • Java網(wǎng)絡(luò)編程UDP協(xié)議發(fā)送接收數(shù)據(jù)

    Java網(wǎng)絡(luò)編程UDP協(xié)議發(fā)送接收數(shù)據(jù)

    這篇文章主要為大家詳細介紹了Java網(wǎng)絡(luò)編程UDP協(xié)議發(fā)送接收數(shù)據(jù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • redisson常用加鎖方式詳解

    redisson常用加鎖方式詳解

    文章介紹了兩種Redisson加鎖方式的區(qū)別:基本的RLock方式和使用RedissonDistributedLocker的tryLock方式,RLock需要手動處理鎖的等待和持有時間,而tryLock則提供了更高層次的封裝,簡化了鎖的操作,并且在超時后會自動返回或釋放鎖
    2026-01-01
  • Java RPC框架過濾器機制原理解析

    Java RPC框架過濾器機制原理解析

    這篇文章主要介紹了Java RPC框架過濾器機制原理解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下
    2020-02-02
  • Java如何優(yōu)雅替換if-else語句

    Java如何優(yōu)雅替換if-else語句

    當邏輯分支非常多的時候,if-else套了一層又一層,那么如何干掉過多的if-else,本文就詳細的介紹一下,感興趣的小伙伴們可以參考一下
    2021-08-08
  • java實現(xiàn)jframe透明窗體示例

    java實現(xiàn)jframe透明窗體示例

    這篇文章主要介紹了java實現(xiàn)jframe透明窗體示例,需要的朋友可以參考下
    2014-03-03

最新評論

许昌市| 乌拉特后旗| 泰顺县| 广河县| 平远县| 金沙县| 特克斯县| 新沂市| 获嘉县| 白沙| 家居| 孝义市| 铁岭县| 江安县| 西贡区| 武平县| 新蔡县| 铜陵市| 社旗县| 十堰市| 亚东县| 南澳县| 祁阳县| 大庆市| 新乐市| 林芝县| 威信县| 鲁山县| 清水河县| 静乐县| 乃东县| 息烽县| 图木舒克市| 周至县| 莒南县| 德化县| 环江| 富宁县| 凯里市| 绥芬河市| 辽源市|