Springboot整合Shiro:動態(tài)權(quán)限配置(讀取yml文件方式)

該篇博客主要內(nèi)容:以yml配置文件的方式滩报,動態(tài)注入需要配置的權(quán)限
接上一篇博客 > Springboot整合Shiro:詳細的權(quán)限管理
*******轉(zhuǎn)載請說明出處座每,謝謝 ********
上篇文章寫到授權(quán)實現(xiàn)的兩種方式(編程式和注解式),兩者在使用時對權(quán)限的配置都是寫死的恢口,如果后期項目需要維護屑宠,更改權(quán)限配置困檩,就無可避免的要進行代碼的修改腰埂。
比如:現(xiàn)在需要將cat角色改為rabbit,那么編程式授權(quán)需要將subject.hasRole("cat")改為subject.hasRole("rabbit")飒焦,注解式授權(quán)需要將@RequiresRoles("cat")改為@RequiresRoles("rabbit"),使用起來很笨重屿笼。
這時候牺荠,動態(tài)配置權(quán)限便顯得很有必要了,我們通過讀取數(shù)據(jù)庫或者權(quán)限的配置文件將權(quán)限注入刁卜,如果需要修改志电,我們只需要修改數(shù)據(jù)庫或者修改相關(guān)的配置文件即可曙咽,無需重新部署項目蛔趴。
如何操作?以yml配置文件為例:
1.定義關(guān)于權(quán)限的配置文件
我們在application.yml(這里將application.prpperties文件改為.yml文件例朱,因為.yml文件用起來更簡潔孝情,當然.properties文件一樣實現(xiàn)功能)中添加需要配置的權(quán)限

##動態(tài)權(quán)限配置文件
#List<Map<String, String>>
permission-config:
  perms:
    - url: /cat
      permission: roles[cat]
    - url: /dog
      permission: roles[dog]
    - url: /sing
      permission: perms[sing]
    - url: /jump
      permission: perms[jump]
    - url: /rap
      permission: perms[rap]
    - url: /basketball
      permission: perms[basketball]
  1. 將配置文件信息的內(nèi)容轉(zhuǎn)化為List<Map<String, String>>,注入到ShiroConfig中洒嗤。
    新建PermsMap

/**
 * @Description 權(quán)限Map 接受配置文件中的數(shù)據(jù)
 * @Author 張小黑的貓
 * @data 2019-05-27 11:19
 */
@Component
@ConfigurationProperties(prefix = "permission-config")
public class PermsMap {

    private List<Map<String,String>> perms;

    public List<Map<String, String>> getPerms() {
        return perms;
    }

    public void setPerms(List<Map<String, String>> perms) {
        this.perms = perms;
    }
}

注意:prefix="permission-config"和perms要與.yml文件中的屬性對應(yīng)

  1. 修改ShiroConfig.java
    先使用@Autowired注入PermsMap箫荡,切記不能使用new PermsMap ()
   @Autowired
    PermsMap permsMap;

更改過濾鏈

 /**
     * 配置Shiro的Web過濾器,攔截瀏覽器請求并交給SecurityManager處理
     * @return
     */
    @Bean
    public ShiroFilterFactoryBean webFilter(SecurityManager securityManager){

        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        //設(shè)置securityManager
        shiroFilterFactoryBean.setSecurityManager(securityManager);

        //配置攔截鏈 使用LinkedHashMap,因為LinkedHashMap是有序的渔隶,shiro會根據(jù)添加的順序進行攔截
        // Map<K,V> K指的是攔截的url V值的是該url是否攔截
        Map<String,String> filterChainMap = new LinkedHashMap<String,String>(16);
        //配置退出過濾器logout羔挡,由shiro實現(xiàn)
        filterChainMap.put("/logout","logout");
        //authc:所有url都必須認證通過才可以訪問; anon:所有url都都可以匿名訪問,先配置anon再配置authc。
        filterChainMap.put("/login","anon");
        // 未授權(quán)界面;
        shiroFilterFactoryBean.setUnauthorizedUrl("/403");

//        //權(quán)限注入
//        filterChainMap.put("/cat","roles[cat]");
        
        //動態(tài)權(quán)限注入
        List<Map<String,String>> perms = permsMap.getPerms();
        perms.forEach(perm->filterChainMap.put(perm.get("url"),perm.get("permission")));

        filterChainMap.put("/**", "authc");

        //設(shè)置默認登錄的URL.
        shiroFilterFactoryBean.setLoginUrl("/login");
        System.out.println(filterChainMap);
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainMap);
        return shiroFilterFactoryBean;
    }

動態(tài)注入要滿足格式filterChainMap.put("/cat","roles[cat]");
這里面又額外配置了未授權(quán)界面shiroFilterFactoryBean.setUnauthorizedUrl("/403");對未通過權(quán)限驗證的界面進行統(tǒng)一跳轉(zhuǎn)403頁面的操作,所以需要配置對應(yīng)的頁面跳轉(zhuǎn)间唉。

 @GetMapping("/403")
    public String page_403(){
     return "403";
    }

4.更改AuthorizationController

@RestController
public class AuthorizationController {

    @GetMapping("/cat")
    public String cat(){
        return "cat";
    }
    @GetMapping("/dog")
    public String dog(){
        return "dog";
    }
    @GetMapping("/sing")
    public String sing(){
        return "sing";
    }
    @GetMapping("/jump")
    public String jump(){
        return "jump";
    }
    @GetMapping("/rap")
    public String rap(){
        return "rap";
    }
    @GetMapping("/basketball")
    public String basketball(){
        return "basketball";
    }
}

5.測試結(jié)果:


authorization3.gif

共同學習绞灼,歡迎指正修改~ 喵喵喵?
下一篇文章:Springboot整合Shiro: Redis緩存

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市呈野,隨后出現(xiàn)的幾起案子低矮,更是在濱河造成了極大的恐慌,老刑警劉巖被冒,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件军掂,死亡現(xiàn)場離奇詭異,居然都是意外死亡昨悼,警方通過查閱死者的電腦和手機蝗锥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來率触,“玉大人终议,你說我怎么就攤上這事。” “怎么了痊剖?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵韩玩,是天一觀的道長。 經(jīng)常有香客問我陆馁,道長找颓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任叮贩,我火速辦了婚禮击狮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘益老。我一直安慰自己彪蓬,他們只是感情好,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布捺萌。 她就那樣靜靜地躺著档冬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桃纯。 梳的紋絲不亂的頭發(fā)上酷誓,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音态坦,去河邊找鬼盐数。 笑死,一個胖子當著我的面吹牛伞梯,可吹牛的內(nèi)容都是我干的玫氢。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼谜诫,長吁一口氣:“原來是場噩夢啊……” “哼漾峡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起猜绣,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤灰殴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后掰邢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牺陶,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年辣之,在試婚紗的時候發(fā)現(xiàn)自己被綠了掰伸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡怀估,死狀恐怖狮鸭,靈堂內(nèi)的尸體忽然破棺而出合搅,到底是詐尸還是另有隱情,我是刑警寧澤歧蕉,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布灾部,位于F島的核電站,受9級特大地震影響惯退,放射性物質(zhì)發(fā)生泄漏赌髓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一催跪、第九天 我趴在偏房一處隱蔽的房頂上張望锁蠕。 院中可真熱鬧,春花似錦懊蒸、人聲如沸荣倾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舌仍。三九已至,卻和暖如春者娱,著一層夾襖步出監(jiān)牢的瞬間抡笼,已是汗流浹背苏揣。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工黄鳍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人平匈。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓框沟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親增炭。 傳聞我的和親對象是個殘疾皇子忍燥,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

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

  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當在唯一索引所對應(yīng)的列上鍵入重復值時,會觸發(fā)此異常隙姿。 O...
    我想起個好名字閱讀 5,334評論 0 9
  • JSPXCMS開發(fā)架構(gòu)介紹 V1 – 架構(gòu)概述 基本概述 配置文件目錄 /src/main/resources/...
    Java_Evan閱讀 4,402評論 0 0
  • 重要說明:本方是翻譯自https://docs.spring.io/spring-cloud-dataflow/d...
    靜悟2020閱讀 10,520評論 1 12
  • 每個系統(tǒng)都有權(quán)限設(shè)計梅垄,本篇主要將初始的權(quán)限設(shè)計的原理,不依賴任何框架输玷,以直觀的角度剖析web的權(quán)限設(shè)計队丝。 權(quán)限設(shè)計...
    放開那個BUG閱讀 4,580評論 2 40
  • 今天是陽歷3月8日,是這一年中的婦女節(jié)欲鹏』茫可是我,今天什么也沒給媽媽做赔嚎,我想媽媽也是很傷心的膘盖,我也非常的怨恨我自己胧弛。...
    不期而遇_31a1閱讀 243評論 0 0