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

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

 更新時間:2023年07月17日 09:02:53   作者:天罡gg  
角色權(quán)限校驗,是保證接口安全必備的能力:有權(quán)限才可以操作,所以,一般對于這種通用邏輯,推薦不與主業(yè)務(wù)邏輯耦合,那么怎么來解耦,那么本文小編就給大家詳細(xì)講解如何使用攔截器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ù)組,默認(rèn)1-管理員
     **/
    int[] roleIds() default { 1 };
}

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

二、攔截角色注解

1. 在攔截器哪里攔截?

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

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

2. 如何攔截角色注解?

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

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

3. 角色如何讀取?

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

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

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)限校驗的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Interceptor統(tǒng)一角色權(quán)限校驗的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java繪制五子棋棋盤

    java繪制五子棋棋盤

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

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

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

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

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

    java 中死鎖問題的實例詳解

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

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

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

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

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

    redisson常用加鎖方式詳解

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

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

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

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

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

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

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

最新評論

南涧| 抚松县| 兴国县| 桂平市| 沙坪坝区| 宁武县| 镇赉县| 凯里市| 金华市| 庄浪县| 南投县| 云梦县| 荆州市| 绥芬河市| 普格县| 清河县| 闸北区| 常宁市| 马边| 文登市| 田林县| 安顺市| 尖扎县| 临邑县| 峡江县| 天台县| 汾西县| 青龙| 黔南| 巴南区| 彰化市| 东乡县| 古浪县| 曲靖市| 桐乡市| 水富县| 连山| 富阳市| 姚安县| 肇州县| 仁寿县|