Springboot-如何使用注解在攔截器中進(jìn)行權(quán)限判斷

??在業(yè)務(wù)邏輯中私蕾,不同的角色擁有各自的職責(zé)穆役,由于職責(zé)不同,所負(fù)責(zé)的功能也不一樣赢乓,就擁有了不同的權(quán)限等級(jí)忧侧。

??而權(quán)限驗(yàn)證通常以攔截請(qǐng)求來實(shí)現(xiàn),但不可能在每個(gè)Controller方法中都編寫一段權(quán)限驗(yàn)證的代碼牌芋,于是使用自定義注解就成了很好的解決方式。

示例

??假設(shè)有一個(gè)業(yè)務(wù)場(chǎng)景松逊,需要判斷用戶所屬的角色是否和要求角色匹配躺屁,那么可能需要進(jìn)行如下操作:

@RequestMapping(value = "/addItem",method = RequestMethod.POST)
public Response addItemByAdmin(HttpServletRequest request,@RequestBody Map<String,Object> jsonObj){
    // 獲取用戶令牌
    String token = request.getHeader("Token");
    // 獲取用戶信息
    User user = userService.findUser(token);
    // 判斷角色是否為管理員
    if(user.getRole()!=Role.ADMIN){
      // 若角色不匹配
      return Response.fail("只有管理員可以進(jìn)行此操作");
    }
    // 如果角色匹配,進(jìn)入業(yè)務(wù)流程
    .....
}

乍一看好像沒有問題经宏,但如果有很多業(yè)務(wù)場(chǎng)景都需要進(jìn)行角色驗(yàn)證犀暑,那這段代碼豈不是每個(gè)方法都要復(fù)制一遍?當(dāng)然不行烁兰。

新建注解[1]

??示例demo提出的需求很簡(jiǎn)單耐亏,只需要一個(gè)角色信息即可完成業(yè)務(wù),所以注解可以這樣設(shè)計(jì):

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PermissionLimit {
    // 注解需要設(shè)置的角色等級(jí)
    int role();
    // 管理員
    int ROLE_ADMIN = 103;
    // 會(huì)員
    int ROLE_VIP = 102;
    // 標(biāo)準(zhǔn)
    int ROLE_STANDARD = 101;
    // 被封禁
    int ROLE_LOCK = 100;
}
  1. 此處Target設(shè)置為METHOD沪斟,是因?yàn)橐话悴煌?qǐng)求會(huì)設(shè)置不同權(quán)限广辰,如果需要按角色編寫Controller,也可以將Target改為TYPE

在攔截器中配置驗(yàn)證

??需要先在攔截器中獲取注解主之,使用注解中設(shè)置的角色對(duì)當(dāng)前用戶進(jìn)行驗(yàn)證择吊,若驗(yàn)證成功才能進(jìn)入方法中執(zhí)行業(yè)務(wù)流程。在攔截器的preHandle中進(jìn)行如下操作:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws BusinessException {
    // 原攔截器操作
    .....
    // 角色驗(yàn)證
    if(!permissionLimit(request, handler)){
        return false;
    }
    // 其他
    .....
    return true;
}

private boolean permissionLimit(HttpServletRequest request, Object handler) throws BusinessException {
    // 如果不是方法
    if (!(handler instanceof HandlerMethod)){
        return true;
    }
    // 獲取注解
    PermissionLimit pl = ((HandlerMethod)handler).getMethodAnnotation(PermissionLimit.class);
    // 如果沒有注解就跳過
    if(pl == null){
        return true;
    }
    // 獲取用戶令牌
    String token = request.getHeader("Token");
    // 獲取用戶信息
    User user = userService.findUser(token);
    // 判斷角色和注解的設(shè)置是否匹配
    return user.getRole()==pl.role()
}
  1. 此處拋出異常而不是直接返回響應(yīng)信息是因?yàn)楫惓槽奕?杀籈xceptionHandler捕獲几睛,由它進(jìn)行統(tǒng)一處理

使用方式

??示例中的方法此時(shí)可改為:

@PermissionLimit(role = PermissionLimit.ADMIN)
@RequestMapping(value = "/addItem",method = RequestMethod.POST)
public Response addItemByAdmin(@RequestBody Map<String,Object> jsonObj){
    // 進(jìn)入業(yè)務(wù)流程
    .....
}






如有錯(cuò)誤,歡迎指出粤攒,謝謝


  1. 創(chuàng)建自定義注解 ?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末所森,一起剝皮案震驚了整個(gè)濱河市囱持,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌焕济,老刑警劉巖洪唐,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吼蚁,居然都是意外死亡凭需,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門肝匆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粒蜈,“玉大人,你說我怎么就攤上這事旗国】莶溃” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵能曾,是天一觀的道長(zhǎng)度硝。 經(jīng)常有香客問我,道長(zhǎng)寿冕,這世上最難降的妖魔是什么蕊程? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮驼唱,結(jié)果婚禮上藻茂,老公的妹妹穿的比我還像新娘。我一直安慰自己玫恳,他們只是感情好辨赐,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著京办,像睡著了一般掀序。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惭婿,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天不恭,我揣著相機(jī)與錄音,去河邊找鬼审孽。 笑死县袱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的佑力。 我是一名探鬼主播式散,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼打颤!你這毒婦竟也來了暴拄?” 一聲冷哼從身側(cè)響起漓滔,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乖篷,沒想到半個(gè)月后响驴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撕蔼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年豁鲤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鲸沮。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡琳骡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出讼溺,到底是詐尸還是另有隱情楣号,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布怒坯,位于F島的核電站炫狱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏剔猿。R本人自食惡果不足惜视译,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望艳馒。 院中可真熱鬧憎亚,春花似錦、人聲如沸弄慰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陆爽。三九已至,卻和暖如春扳缕,著一層夾襖步出監(jiān)牢的瞬間慌闭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工躯舔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留驴剔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓粥庄,卻偏偏與公主長(zhǎng)得像丧失,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惜互,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容