Shiro7-Shiro 授權(quán)的入門(mén)程序

復(fù)習(xí)

什么是權(quán)限管理?
權(quán)限管理是系統(tǒng)的安全范濤, 要求必須是合法用戶(hù)才能訪問(wèn)系統(tǒng)(用戶(hù)認(rèn)證), 且必須具有該資源的訪問(wèn)權(quán)限才可以訪問(wèn)資源(授權(quán)).
認(rèn)證: 對(duì)用戶(hù)身份校驗(yàn),要求必須是合法用戶(hù)才能訪問(wèn)系統(tǒng).
授權(quán): 訪問(wèn)控制, 必須具有該資源的訪問(wèn)權(quán)限才能訪問(wèn)該資源.

權(quán)限模型: 標(biāo)準(zhǔn)權(quán)限數(shù)據(jù)模型包括:用戶(hù),角色,權(quán)限(包括資源和權(quán)限),用戶(hù)角色關(guān)系,角色權(quán)限關(guān)系.
權(quán)限分配: 用過(guò) UI 界面方便給用戶(hù)分配權(quán)限, 對(duì)上邊權(quán)限模型進(jìn)行增刪改查操作.
權(quán)限控制:
????基于角色的權(quán)限控制: 根據(jù)角色判斷是否有操作權(quán)限, 因?yàn)榻巧赡芤S時(shí)發(fā)生變化, 所以當(dāng)角色發(fā)生變化時(shí), 我們需要修改系統(tǒng)代碼. 這也就意味著系統(tǒng)可維護(hù)性不強(qiáng).
????基于組員的權(quán)限控制: 根據(jù)資源判斷是否有操作權(quán)限, 因?yàn)楫?dāng)我們開(kāi)發(fā)完系統(tǒng)后, 一些 URL 是很少發(fā)生變化的, 也就是說(shuō)不管角色怎么變化,這些 URL 是不變的,所以系統(tǒng)的可維護(hù)性強(qiáng).

權(quán)限管理的解決方案:
????對(duì)于粗顆粒權(quán)限管理,建議在系統(tǒng)的架構(gòu)層面解決.
比如當(dāng)我們用戶(hù)認(rèn)證后,獲取用戶(hù)的菜單, 不同的用戶(hù)有不同的菜單.也就是說(shuō)對(duì)資源進(jìn)行權(quán)限管理.
????對(duì)細(xì)顆粒權(quán)限管理,建議在系統(tǒng)業(yè)務(wù)層進(jìn)行處理.
比如當(dāng)我們要修改或刪除某條信息的時(shí)候, 不判斷是否有權(quán)限.

基于 URL 的權(quán)限管理(掌握):
????使用 web 應(yīng)用中filter 來(lái)實(shí)現(xiàn), 用戶(hù)請(qǐng)求 url, 通過(guò) filter 攔截,判斷用戶(hù)身份是否合法(用戶(hù)認(rèn)證), 再判斷請(qǐng)求地址是否是用戶(hù)權(quán)限范圍內(nèi)的 url(授權(quán)).

Shiro 授權(quán)流程

Shiro 授權(quán)流程

授權(quán)方式

Shiro 支持三種授權(quán)的權(quán)限:
編程式: 通過(guò)編寫(xiě) if/else 權(quán)限代碼塊完成

Subject subject = SecurityUtils.getSubject();
if(subject.hasRole("admin")){
  //有權(quán)限
} else {
  //無(wú)權(quán)限
}

注解式: 通過(guò)在執(zhí)行的 Java 方法上放置相應(yīng)的注解完成

@RequiresRoles("admin")
public void hello(){
  //有權(quán)限
}

jsp/GSP 標(biāo)簽:在 jsp/gsp 頁(yè)面通過(guò)相應(yīng)的標(biāo)簽完成

<shiro:hasRole name="admin">
<!-- 有權(quán)限 -->
</shiro:hasRole>

授權(quán)入門(mén)程序

** 創(chuàng)建 shiro-permission.ini 文件**

#用戶(hù)
[users]
#用戶(hù) zhang 密碼是123,此用戶(hù)具有role1和role2兩個(gè)角色
zhangsan=123,role1,role2
wang=123,role2

#角色
[roles]
# 角色role1對(duì)資源 user 用于 create 和 update 權(quán)限.
role1=user:create,user:update
role2=user:create,user:delete
role3=user:create

權(quán)限標(biāo)識(shí)符規(guī)則: 資源:操作:實(shí)例
例如user:create:01表示對(duì)用戶(hù)資源的01實(shí)例進(jìn)行 create 操作.
例如user:create表示對(duì)用戶(hù)資源進(jìn)行 create 操作.相當(dāng)于``user:create:*```

具體實(shí)現(xiàn)

    // 角色授權(quán)幢妄、資源授權(quán)測(cè)試
    @Test
    public void testAuthorization() {

        // 創(chuàng)建SecurityManager工廠
        Factory<SecurityManager> factory = new IniSecurityManagerFactory(
                "classpath:shiro-permission.ini");

        // 創(chuàng)建SecurityManager
        SecurityManager securityManager = factory.getInstance();

        // 將SecurityManager設(shè)置到系統(tǒng)運(yùn)行環(huán)境,和spring后將SecurityManager配置spring容器中蘑辑,一般單例管理
        SecurityUtils.setSecurityManager(securityManager);

        // 創(chuàng)建subject
        Subject subject = SecurityUtils.getSubject();

        // 創(chuàng)建token令牌
        UsernamePasswordToken token = new UsernamePasswordToken("zhangsan",
                "123");

        // 執(zhí)行認(rèn)證
        try {
            subject.login(token);
        } catch (AuthenticationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println("認(rèn)證狀態(tài):" + subject.isAuthenticated());
        // 認(rèn)證通過(guò)后執(zhí)行授權(quán)

        // 基于角色的授權(quán)
        // hasRole傳入角色標(biāo)識(shí)
        boolean ishasRole = subject.hasRole("role1");
        System.out.println("單個(gè)角色判斷" + ishasRole);
        // hasAllRoles是否擁有多個(gè)角色
        boolean hasAllRoles = subject.hasAllRoles(Arrays.asList("role1",
                "role2", "role3"));
        System.out.println("多個(gè)角色判斷" + hasAllRoles);

        // 使用check方法進(jìn)行授權(quán)券膀,如果授權(quán)不通過(guò)會(huì)拋出異常
        // subject.checkRole("role13");

        // 基于資源的授權(quán)
        // isPermitted傳入權(quán)限標(biāo)識(shí)符
        boolean isPermitted = subject.isPermitted("user:create:1");
        System.out.println("單個(gè)權(quán)限判斷" + isPermitted);

        boolean isPermittedAll = subject.isPermittedAll("user:create:1",
                "user:delete");
        System.out.println("多個(gè)權(quán)限判斷" + isPermittedAll);

        // 使用check方法進(jìn)行授權(quán)爽撒,如果授權(quán)不通過(guò)會(huì)拋出異常
        // subject.checkPermission("items:create:1");

    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挪哄,一起剝皮案震驚了整個(gè)濱河市私沮,隨后出現(xiàn)的幾起案子移怯,更是在濱河造成了極大的恐慌香璃,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舟误,死亡現(xiàn)場(chǎng)離奇詭異葡秒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)嵌溢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)眯牧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人赖草,你說(shuō)我怎么就攤上這事学少。” “怎么了秧骑?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵版确,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我乎折,道長(zhǎng)绒疗,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任骂澄,我火速辦了婚禮吓蘑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坟冲。我一直安慰自己磨镶,他們只是感情好溃蔫,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著棋嘲,像睡著了一般酒唉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沸移,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天痪伦,我揣著相機(jī)與錄音,去河邊找鬼雹锣。 笑死网沾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蕊爵。 我是一名探鬼主播辉哥,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼攒射!你這毒婦竟也來(lái)了醋旦?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤会放,失蹤者是張志新(化名)和其女友劉穎饲齐,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體咧最,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捂人,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了矢沿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滥搭。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖捣鲸,靈堂內(nèi)的尸體忽然破棺而出瑟匆,到底是詐尸還是另有隱情,我是刑警寧澤栽惶,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布脓诡,位于F島的核電站,受9級(jí)特大地震影響媒役,放射性物質(zhì)發(fā)生泄漏祝谚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一酣衷、第九天 我趴在偏房一處隱蔽的房頂上張望交惯。 院中可真熱鬧,春花似錦、人聲如沸席爽。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)只锻。三九已至玖像,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間齐饮,已是汗流浹背捐寥。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祖驱,地道東北人握恳。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像捺僻,于是被迫代替她去往敵國(guó)和親乡洼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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

  • 一.Shiro簡(jiǎn)介 Shiro框架是和spring security框架作用差不多的一個(gè)安全認(rèn)證授權(quán)框架匕坯,但它更加...
    興厚閱讀 5,536評(píng)論 0 14
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理束昵,服務(wù)發(fā)現(xiàn),斷路器葛峻,智...
    卡卡羅2017閱讀 134,715評(píng)論 18 139
  • 今天看的是人類(lèi)簡(jiǎn)史第一章锹雏,因?yàn)槭怯涗涱?lèi)的書(shū)籍,把看到的有用信息記錄下: 1.歷史大三重要革命:認(rèn)知革命泞歉,農(nóng)業(yè)革...
    hanxuerping閱讀 100評(píng)論 0 0
  • 早晨打開(kāi)的時(shí)候看見(jiàn)這兩句話(huà),不由得直點(diǎn)頭匿辩,有道理腰耙,有道理!是的,我們只有自覺(jué)的從自己的內(nèi)心深處向外不斷的突...
    下半輩子_閱讀 140評(píng)論 0 0
  • 點(diǎn)了杯茉莉花茶铲球,坐在Cafe Factory里挺庞,思索著我人生的濃度定義是什么?回顧著我過(guò)往的人生稼病,沉思著我...
    最美最遠(yuǎn)的旅行閱讀 293評(píng)論 0 1