spring 自定義注解實(shí)現(xiàn)權(quán)限攔截

先描述一下應(yīng)用場(chǎng)景汤纸,基于Spring MVC的WEB程序,需要對(duì)每個(gè)Action進(jìn)行權(quán)限判斷惯驼,當(dāng)前用戶有權(quán)限則允許執(zhí)行Action蹲嚣,無權(quán)限要出錯(cuò)提示。權(quán)限有很多種祟牲,比如用戶管理權(quán)限隙畜、日志審計(jì)權(quán)限、系統(tǒng)配置權(quán)限等等说贝,每種權(quán)限還會(huì)帶參數(shù)议惰,比如各個(gè)權(quán)限還要區(qū)分讀權(quán)限還是寫權(quán)限。

想實(shí)現(xiàn)統(tǒng)一的權(quán)限檢查乡恕,就要對(duì)Action進(jìn)行攔截言询,一般是通過攔截器來做,可以實(shí)現(xiàn)HandlerInterceptor或者HandlerInterceptorAdapter傲宜,但是每個(gè)Action都有不同的權(quán)限檢查运杭,比如getUsers要用戶管理的讀權(quán)限,deleteLogs要日志審計(jì)的寫權(quán)限函卒,只定義一個(gè)攔截器很難做到辆憔,為每種權(quán)限定義一個(gè)攔截器又太亂,此時(shí)可以通過自定義注解來標(biāo)明每個(gè)Action需要什么權(quán)限报嵌,然后在單一的攔截器里就可以統(tǒng)一檢查了虱咧。

具體這么做,先實(shí)現(xiàn)一個(gè)自定義注解锚国,名叫AuthCheck:

package com.lwq.controller;

import java.lang.annotation.Documented;

import java.lang.annotation.Inherited;

import java.lang.annotation.Retention;

import java.lang.annotation.Target;

import java.lang.annotation.ElementType;

import java.lang.annotation.RetentionPolicy;

@Documented

@Target(ElementType.METHOD)

@Inherited

@Retention(RetentionPolicy.RUNTIME)

public @interface AuthCheck {

/**

? ? * 權(quán)限類型

? ? * @return

? ? */

? ? String type()default "";

/**

? ? * 是否需要寫權(quán)限

? ? * @return

? ? */

? ? boolean write()default false;

}

具體可根據(jù)需要來定義類型腕巡,此處只建立兩個(gè)

這個(gè)注解里包含2個(gè)屬性,分別用于標(biāo)定權(quán)限的類型與讀寫要求血筑。然后為需要檢查權(quán)限的Action加注解绘沉,此處以getUsers和deleteLogs為例,前者要求對(duì)用戶管理有讀權(quán)限豺总,后者要求對(duì)日志審計(jì)有寫權(quán)限梆砸,注意@AuthCheck的用法:

然后定義權(quán)限攔截代碼

package com.lwq.controller;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.method.HandlerMethod;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

/**

* 全局?jǐn)r截器

*/

public class ActionTestInterceptorimplements HandlerInterceptor {

/**

? ? * 前置攔截,用于檢查身份與權(quán)限

? ? */

? ? @Override

? ? public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {

//從傳入的handler中檢查是否有AuthCheck的聲明

? ? ? ? HandlerMethod method = (HandlerMethod)handler;

AuthCheck auth = method.getMethodAnnotation(AuthCheck.class);

//找到了园欣,取出定義的權(quán)限屬性,結(jié)合身份信息進(jìn)行檢查

if(auth !=null) {

????????????String type = auth.type();

????????????boolean write = auth.write();

????????????//根據(jù)type與write休蟹,結(jié)合session/cookie等身份信息進(jìn)行檢查

? ? ? ? ? ? //如果權(quán)限檢查不通過沸枯,可以輸出特定信息日矫、進(jìn)行跳轉(zhuǎn)等操作

? ? ? ? ? ? //并且一定要return false,表示被攔截的方法不用繼續(xù)執(zhí)行了

? ? ? ? ? ? if(!"user".equals(type)){

????????????????????//具體根據(jù)業(yè)務(wù)去查詢绑榴,比如數(shù)據(jù)查詢出來之后與type和write進(jìn)行比較哪轿,注意:對(duì)比失敗一定要返回false

????????????????????return false;

????????????}

}

//檢查通過,返回true翔怎,方法會(huì)繼續(xù)執(zhí)行

? ? ? ? return true;

}

@Override

? ? public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView model)throws Exception {

}

@Override

? ? public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception)throws Exception {

}

}

最后要實(shí)現(xiàn)攔截器:

注意 要聲明攔截器的攔截路徑窃诉,不然無法實(shí)現(xiàn)攔截功能

package com.lwq.controller;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.servlet.config.annotation.InterceptorRegistry;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**

* 攔截器配置

* Created by gaocl on 16-3-1.

*/

@Configuration

public class InterceptorConfigextends WebMvcConfigurerAdapter {

//注入需要攔截的類

? ?@Bean

? ? public ActionTestInterceptor logInterceptor() {

? ? ? ? ? ? ?return new ActionTestInterceptor();

? ? ?}

? ?@Override

? ? public void addInterceptors(InterceptorRegistry registry) {

? ? ? ? ? ? ? ? //配置攔截路徑,運(yùn)行訪問即可生效

? ? ? ? ? ? ? registry.addInterceptor(logInterceptor()).addPathPatterns("/**");

? ? ?}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赤套,一起剝皮案震驚了整個(gè)濱河市飘痛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌容握,老刑警劉巖宣脉,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異剔氏,居然都是意外死亡塑猖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門谈跛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來羊苟,“玉大人,你說我怎么就攤上這事感憾±” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵吹菱,是天一觀的道長(zhǎng)巍虫。 經(jīng)常有香客問我,道長(zhǎng)鳍刷,這世上最難降的妖魔是什么占遥? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮输瓜,結(jié)果婚禮上瓦胎,老公的妹妹穿的比我還像新娘。我一直安慰自己尤揣,他們只是感情好搔啊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著北戏,像睡著了一般负芋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嗜愈,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天旧蛾,我揣著相機(jī)與錄音莽龟,去河邊找鬼。 笑死锨天,一個(gè)胖子當(dāng)著我的面吹牛毯盈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播病袄,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼搂赋,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了益缠?” 一聲冷哼從身側(cè)響起脑奠,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎左刽,沒想到半個(gè)月后捺信,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡欠痴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年迄靠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喇辽。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡掌挚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出菩咨,到底是詐尸還是另有隱情吠式,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布抽米,位于F島的核電站特占,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏云茸。R本人自食惡果不足惜是目,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望标捺。 院中可真熱鬧懊纳,春花似錦、人聲如沸亡容。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闺兢。三九已至茂缚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背阱佛。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工帖汞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凑术。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像所意,于是被迫代替她去往敵國(guó)和親淮逊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理扶踊,服務(wù)發(fā)現(xiàn)泄鹏,斷路器,智...
    卡卡羅2017閱讀 134,652評(píng)論 18 139
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架秧耗,建立于...
    Hsinwong閱讀 22,394評(píng)論 1 92
  • 對(duì)于java中的思考的方向备籽,1必須要看前端的頁面,對(duì)于前端的頁面基本的邏輯分井,如果能理解最好车猬,不理解也要知道幾點(diǎn)。 ...
    神尤魯?shù)婪?/span>閱讀 812評(píng)論 0 0
  • ?著作權(quán)歸作者所有:來自51CTO博客作者優(yōu)秀android的原創(chuàng)作品尺锚,如需轉(zhuǎn)載珠闰,請(qǐng)注明出處,否則將追究法律責(zé)任 ...
    傳奇內(nèi)服號(hào)閱讀 1,071評(píng)論 0 9
  • 萬物皆有裂痕那又怎樣裂痕是光照進(jìn)來的地方 假期在西昌見了老婆的閨蜜聽老婆講了許多她的故事她們都算同齡人中比例不錯(cuò)的...
    承謙閱讀 309評(píng)論 0 0