實現(xiàn)RBAC權(quán)限管理的心路歷程

簡介

RBAC是基于角色的權(quán)限控制,讓角色綁定權(quán)限橡卤,用戶綁定角色,它們之間都是多對多的關(guān)系损搬。

用戶和角色好理解碧库,但是權(quán)限究竟應(yīng)該怎么標示,可以抽象成一句話來概括:誰在什么地方能進行什么操作巧勤。
什么地方可以對應(yīng)模塊嵌灰,什么操作可以對應(yīng)模塊開放的接口。

數(shù)據(jù)庫設(shè)計

權(quán)限控制分為三個實體颅悉,角色沽瞭、用戶、模塊
簡要的E-R模型

E-R模型

user和passport分開是為了邏輯更清晰剩瓶,因為登陸只需要驗證賬號密碼等賬號相關(guān)的信息驹溃,可以只對一個表進行操作。
賬號和角色多對多延曙,沒問題豌鹤。
角色、模塊枝缔、操作共同構(gòu)成的關(guān)系就是權(quán)限布疙。表述了:誰(角色)在什么地方(模塊)能夠做什么(操作)

使用aop做全局的權(quán)限控制

關(guān)于可配置的思考
角色和權(quán)限的綁定肯定需要動態(tài)的,也就是可以運行時配置的。

但是模塊和操作的新增不一定能夠做到可配置灵临,因為操作和模塊都是需要對應(yīng)到代碼的截型。比如,需要新增一個訂單管理模塊儒溉,肯定是需要編碼宦焦,編寫相應(yīng)接口,然后才能夠工作的睁搭。必須要先有這個模塊的實現(xiàn)赶诊,才能在數(shù)據(jù)庫中進行配置訪問權(quán)限笼平,這是理所當(dāng)然的园骆。因此,模塊的新增不必在程序運行時配置寓调。

還有一個問題锌唾,怎么將數(shù)據(jù)庫中action表的記錄對應(yīng)到代碼的方法上。我采用了注解夺英。
權(quán)限注解:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Privilege {
    ModuleType moduleType();//模塊
    ActionType actionType();//操作
}

操作:

public enum ActionType {
    ADD(1),EDIT(2),DEL(3),SHOW(4);
    int value;//對應(yīng)數(shù)據(jù)庫中操作的id

    ActionType(int value){
        this.value = value;
    }

    public int getValue(){
        return value;
    }
}

數(shù)據(jù)庫中存儲的操作記錄:



模塊:

public enum ModuleType {
    PRIVILEGE_MANAGEMENT(1);

    int value;
    ModuleType(int value){
        this.value = value;
    }
    public int getValue(){
        return value;
    }
}

數(shù)據(jù)庫中的模塊記錄:

全局權(quán)限控制的切面:

    @Around("@annotation(privilege)")
    public Object checkPrivilege(ProceedingJoinPoint joinPoint
            , Privilege privilege) throws Throwable {
        SessionUser user = (SessionUser) SessionUtil.getCurrentSession().getAttribute("user");
        if (user==null){
            throw new RuntimeException("haven't login yet!");
        }
        if(!privilegeService.checkPrivilege(user
                , privilege.moduleType().getValue()
                , privilege.actionType().getValue())){
            throw new RuntimeException("access denied!");
        }
        return joinPoint.proceed();
    }

攔截注解@Privilege晌涕,根據(jù)其提供的模塊信息和操作信息進行權(quán)限校驗。

使用:
編寫模塊痛悯,并通過注解標識其方法對應(yīng)的操作:

@RestController
public class TestController {
    @RequestMapping("add")
    @Privilege(moduleType = ModuleType.PRIVILEGE_MANAGEMENT
            ,actionType = ActionType.ADD)
    public Object testAdd(){
        return "add ok!";
    }
}

配置權(quán)限:


sys_role_actions

actions字段適當(dāng)冗余減少記錄數(shù)余黎。

權(quán)限控制流程:
訪問testAdd方法,被切面攔截载萌,進入checkPrivilege方法惧财,在該方法中,通過testAdd方法上的@Privilege注解扭仁,獲取到testAdd方法對應(yīng)的操作和模塊垮衷,同時獲取當(dāng)前sesssion會話中的用戶角色,根據(jù)角色乖坠、模塊查詢數(shù)據(jù)庫搀突,獲取到能夠進行的操作,與當(dāng)前testAdd方法的操作比對熊泵,從而確定是否有權(quán)訪問此方法仰迁。比對成功,繼續(xù)執(zhí)行顽分,比對失敗徐许,拋出權(quán)限不足異常。

對于這種實現(xiàn)的優(yōu)劣分析

優(yōu)點很明顯怯邪,能夠做到角色權(quán)限可配置绊寻,用戶角色可配置,而且也減小了權(quán)限邏輯和業(yè)務(wù)邏輯的耦合度,需要調(diào)用權(quán)限控制澄步,只需要加上權(quán)限控制的注解即可冰蘑。
缺點也很明顯,無法做到模塊和操作的動態(tài)增加村缸,因為模塊和操作都是硬編碼的祠肥,每次新增模塊或者新增操作,勢必要經(jīng)過修改代碼梯皿、編譯仇箱、重新運行的過程。

demo:
https://github.com/DangerousPrayer/sso-server
僅作參考东羹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末剂桥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子属提,更是在濱河造成了極大的恐慌权逗,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冤议,死亡現(xiàn)場離奇詭異斟薇,居然都是意外死亡,警方通過查閱死者的電腦和手機恕酸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門堪滨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蕊温,你說我怎么就攤上這事袱箱。” “怎么了寿弱?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵犯眠,是天一觀的道長。 經(jīng)常有香客問我症革,道長筐咧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任噪矛,我火速辦了婚禮量蕊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘艇挨。我一直安慰自己残炮,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布缩滨。 她就那樣靜靜地躺著势就,像睡著了一般泉瞻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苞冯,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天袖牙,我揣著相機與錄音,去河邊找鬼舅锄。 笑死鞭达,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的皇忿。 我是一名探鬼主播畴蹭,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鳍烁!你這毒婦竟也來了叨襟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤老翘,失蹤者是張志新(化名)和其女友劉穎芹啥,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铺峭,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年汽纠,在試婚紗的時候發(fā)現(xiàn)自己被綠了卫键。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡虱朵,死狀恐怖莉炉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碴犬,我是刑警寧澤絮宁,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站服协,受9級特大地震影響绍昂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜偿荷,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一窘游、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跳纳,春花似錦忍饰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽力崇。三九已至,卻和暖如春赢织,著一層夾襖步出監(jiān)牢的瞬間餐曹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工敌厘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留台猴,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓俱两,卻偏偏與公主長得像饱狂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宪彩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理休讳,服務(wù)發(fā)現(xiàn),斷路器尿孔,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評論 6 342
  • 一次失敗算什么俊柔,人生苦短。坦然面對活合,笑看人生雏婶! 粗心和驕傲讓自己敗得很慘,這次說教材考試讓我正視了自己白指,人外有...
    佳玉兒閱讀 223評論 0 2
  • 老公: 最近發(fā)生的事情就像做夢一樣留晚,我多想一覺醒來,又回到以前告嘲! 然而错维,時光的齒輪不會倒退。所以我就想橄唬,這一定是生...
    設(shè)計公主閱讀 849評論 0 7