SpringBoot框架+shiro權(quán)限管理

當(dāng)然先手寫大概流程:

1.shiro簡介

2.集成shiro核心分析

3.無shiro的SpringBoot

4.集成shiro進(jìn)行用戶授權(quán)

5.shiro緩存

6.shiro記住密碼

7.shiro驗(yàn)證碼

第一步:shiro簡介:

shiro是開源安全框架凶异,主要功能:認(rèn)證剩彬、授權(quán)、加密沃饶、回話管理糊肤。

shiro三大核心組件:

- Subject當(dāng)前用戶操作

- SecurityManager用于管理所有的Subject

- Realms用于進(jìn)行權(quán)限信息的驗(yàn)證,也是我們需要自己實(shí)現(xiàn)的业舍。

先簡單理一下舷暮,首先shiro先通過核心Filter來實(shí)現(xiàn)噩茄,就像SpringMvc通過DispachServlet來控制一樣巢墅。Filter:通過url規(guī)則進(jìn)行過濾和權(quán)限效驗(yàn),我們想要定義一系列Url規(guī)則和訪問權(quán)限來控制。

運(yùn)行程序?qū)⑸厦孀哌^了解整個規(guī)則之后蓄髓,會進(jìn)行Realms認(rèn)證和授權(quán)会喝,Realms的Authentication和Authorization玩郊。其中Authentication是用來驗(yàn)證用戶身份译红,Authorization是授權(quán)訪問控制侦厚,用于對用戶進(jìn)行的操作授權(quán),證明該用戶是否允許進(jìn)行當(dāng)前操作诗宣,如訪問某個鏈接召庞,某個資源文件等。


第二步:集成Shiro核心分析

1.ShiroFilterFactory忘古,Shiro過濾器工廠類存皂,具體的實(shí)現(xiàn)類::ShiroFilterFactoryBean逢艘,此實(shí)現(xiàn)類是依賴于SecurityManager安全管理器它改。

2.sercurityManager,shiro的安全管理央拖,主要是身份認(rèn)證的管理,緩存管理专控,cookie管理伦腐,ShiroFilterFactory主要配置好了Filter就可以了失都。當(dāng)然SecurityManager并進(jìn)行身份認(rèn)證緩存的實(shí)現(xiàn)粹庞,我們需要進(jìn)行對應(yīng)的編碼然后進(jìn)行注入到安全管理器中庞溜。

3.Realm,用于身份信息權(quán)限信息的驗(yàn)證强缘。

4.其它的就是緩存管理,記住登錄之類的赏胚,這些大部分都是需要自己進(jìn)行簡單的實(shí)現(xiàn)觉阅,然后注入到SecurityManager讓Shiro的安全管理器進(jìn)行管理就好了。


第三步:無shiro的SpringBoot

1.配置依賴:


pom.xml

2.編寫前端頁面路勁要注意:src/main/resouces/templates

index.html
login.html

這里還有其他頁面可以自己隨便寫兩個就行


3.編寫啟動類:

App.java

4.編寫HomeController類

HomeController.java

上面都是最簡單的小demo割笙,現(xiàn)在來重點(diǎn):

第四步 集成shiro進(jìn)行用戶授權(quán):

這里要分幾點(diǎn)說:

1.pom.xml需要加依賴

2.注入 shiro Factory 和SecuirtyManager

3.身份認(rèn)證

4.權(quán)限控制


1.shrio依賴


2.注入Shiro Factory和SecurityManager般码;

首先截圖不給力截圖主要部分創(chuàng)建一個類ShiroConfiguration類中方法如圖:

過濾器規(guī)則

這里要解釋一下:

anon:所有url都都可以匿名訪問;

authc:需要認(rèn)證才能進(jìn)行訪問;

user:配置記住我或認(rèn)證通過可以訪問板祝;

ShiroFilterFactoryBean處理攔截問題的時候需要注入:SecurityManager否則報錯


3.身份認(rèn)證這里不得不提數(shù)據(jù)庫走净,這里會用jpa首先解釋一下jpa的標(biāo)準(zhǔn)是你操作的是實(shí)體類伏伯,數(shù)據(jù)庫由jpa來維護(hù)说搅,這個意思就是你寫過實(shí)體類對應(yīng)表的關(guān)系,數(shù)據(jù)庫你就不用管了,你只需要啟動項(xiàng)目jpa就會幫你自動生成數(shù)據(jù)庫表的關(guān)系套才,他參考你的而實(shí)體類背伴。

a:加數(shù)據(jù)庫依賴和jpa

b:數(shù)據(jù)庫連接

c:實(shí)體類

d:身份認(rèn)證

a如圖:

jpa依賴和數(shù)據(jù)驅(qū)動

b如圖:


連接數(shù)據(jù)庫

c:是數(shù)據(jù)庫實(shí)體類我就要解釋一下我的原理:

我們現(xiàn)在要建立用戶登錄表Userinfo傻寂、角色表SysRole疾掰、權(quán)限表SysPermission

一個用戶對應(yīng)是有多個角色的静檬,一個角色對應(yīng)不同的權(quán)限,當(dāng)然一個權(quán)限也可以對應(yīng)多個角色

所以 用戶vs角色 ?一對多 ? ?角色vs權(quán)限 多對多

舉例: ?一個用戶A研究生侮腹,A的角色既可以是老師父阻,也可以是學(xué)生望抽,

學(xué)生權(quán)限:吃飯糠聪、睡覺舰蟆,上課。

老師權(quán)限:吃飯味悄、睡覺塌鸯,教書丙猬。 ?

這里需要注意這只是其中一種理解方式茧球,你會發(fā)現(xiàn)權(quán)限會重復(fù)吃飯睡覺抢埋,那怎么辦,我們換一種理解方式

舉例: ?一個用戶B研究生穷吮,B的角色既可以是老師捡鱼,也可以是學(xué)生肪凛,

學(xué)生權(quán)限:吃飯、睡覺滴铅,上課汉匙。

老師特殊權(quán)限:教書

這樣你會發(fā)現(xiàn)你不會重復(fù)生蚁,我的意思邦投,一個角色就固定權(quán)限志衣,但是特殊的角色你就給他特殊的角色權(quán)限這樣不會重復(fù)。


Userinfo用戶表


SysRole角色表


SysPermission權(quán)限表

這里寫過記得加上get、set方法和toString方法吉懊,然后啟動程序借嗽,你會神奇發(fā)現(xiàn)數(shù)據(jù)庫會自動建表淹魄。

好啦數(shù)據(jù)庫建成插入數(shù)據(jù)堡距,記得要一一對應(yīng)上坝鸾洹:

INSERT INTO `SysPermission` VALUES ('1', '1', '用戶管理', '0', '0/', 'userInfo:view', 'menu', 'userInfo/userList');

INSERT INTO `SysPermission` VALUES ('2', '1', '用戶添加', '1', '0/1', 'userInfo:add', 'button', 'userInfo/userAdd');

INSERT INTO `SysRole` VALUES ('1', '1', '管理員', 'admin');

INSERT INTO `SysRole` VALUES ('2', '1', 'VIP會員', 'vip');

INSERT INTO `SysRolePermission` VALUES ('1', '1');

INSERT INTO `SysRolePermission` VALUES ('1', '2');

INSERT INTO `SysUserRole` VALUES ('1', '1');

INSERT INTO `SysUserRole` VALUES ('1', '2');

INSERT INTO `UserInfo` VALUES ('1', '管理員', 'admin', 'd3c59d25033dbf980d29554025c23a75', '8d78869f470951332959580424d4bf4f', '0');

上面如果都準(zhǔn)備完成了易稠,就可以進(jìn)入邏輯層了驶社。

UserInfoRepository類用戶類的持久化

其實(shí)就相當(dāng)于數(shù)據(jù)庫通過一個字段查詢

這里還要編寫調(diào)用這個方法的類亡电,這里用mvc模式份乒,一個接口一個實(shí)現(xiàn)類:

這里主要啟動調(diào)用查詢做用實(shí)際意義不大

其實(shí)上面所有的步驟都是為這一步打基礎(chǔ),shiro的認(rèn)證是交給Realm執(zhí)行了或辖。所以我們需要自己重新實(shí)現(xiàn)一個Realm颂暇,此Realm必須繼承AuthorizingRealm。

這里不好截圖我就先解釋一下必須繼承AuthorizingRealm原因:

因?yàn)樵贏uthorizingRealm中有兩個方法:

doGetAuthenticationInfo();

doGetAuthorizationInfo();

其中doGetAuthenticationInfo主要是用來進(jìn)行身份認(rèn)證的湿蛔,也就是說驗(yàn)證用戶輸入的賬號和密碼是否正確煌集。(如圖)

身份認(rèn)證

至于doGetAuthorizationInfo()是權(quán)限控制苫纤,當(dāng)訪問到頁面的時候卷拘,使用了相應(yīng)的注解或者shiro標(biāo)簽才會執(zhí)行此方法否則不會執(zhí)行栗弟,所以如果只是簡單的身份認(rèn)證沒有權(quán)限的控制的話工闺,那么這個方法可以不進(jìn)行實(shí)現(xiàn)陆蟆,直接返回null即可叠殷。

在這個方法中主要是使用類:SimpleAuthorizationInfo

進(jìn)行角色的添加和權(quán)限的添加。

authorizationInfo.addRole(role.getRole());

authorizationInfo.addStringPermission(p.getPermission());

當(dāng)然也可以添加集合:

authorizationInfo.setRoles(roles);

authorizationInfo.setStringPermissions(stringPermissions);

如圖:


這里要加點(diǎn)東西稽亏,因?yàn)槭謱懙腞ealm截歉,默認(rèn)是讀取不到的怎披,所以我們要在ShiroConfiguration過濾器那邊瓶摆,Realm注入到SecurityManager中群井。


ShiroConfiguration

身份認(rèn)證基本完成了還要在homeController哪里加上login post處理

HomeController

這里登錄肯定還會報錯因?yàn)槲覀兠艽a是用密文方式加密還要編寫一個方法類ShiroConfiguration:


這時候在訪問/login進(jìn)行登錄就可以登陸到/index界面了诬辈。

4.權(quán)限控制這是最讓人頭疼的


然后運(yùn)行登錄進(jìn)行訪問:http://127.0.0.1:8080/userInfo/userAdd

并沒有執(zhí)行doGetAuthorizationInfo()打印信息,所以我們會發(fā)現(xiàn)我們的身份認(rèn)證是好使了样屠,但是權(quán)限控制好像沒有什么作用哦痪欲。

我們少了幾部分代碼业踢,

第一就是開啟shiro aop注解支持,這個只需要在com.kfit.config.shiro.ShiroConfiguration加入如下方法進(jìn)行開啟即可:


這時候在訪問http://127.0.0.1:8080/userInfo/userAdd會看到控制臺打印信息:

權(quán)限配置-->MyShiroRealm.doGetAuthorizationInfo()

如果訪問:http://127.0.0.1:8080/userInfo/userDel會看到

Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Sat May 21 22:17:55 CST 2016

There was an unexpected error (type=Internal Server Error, status=500).

Subject does not have permission [userInfo:del]

當(dāng)然我們需要在UserInfoController方法中加入:


在上面的錯誤信息中Subject does not have permission可以看出此用戶沒有這個權(quán)限雇锡。好了遮糖,至此Shiro的權(quán)限控制到此先告一段落叠赐。在這里我先拋出一個問題:我們不斷的訪問http://127.0.0.1:8080/userInfo/userAdd你會看到


留下Demo地址:

http://pan.baidu.com/s/1mhTr8Ju

####指導(dǎo)qq:179061434

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赛不,一起剝皮案震驚了整個濱河市惩嘉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌踢故,老刑警劉巖文黎,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異殿较,居然都是意外死亡耸峭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門淋纲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劳闹,“玉大人洽瞬,你說我怎么就攤上這事本涕。” “怎么了伙窃?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵菩颖,是天一觀的道長。 經(jīng)常有香客問我为障,道長晦闰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任产场,我火速辦了婚禮鹅髓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘京景。我一直安慰自己窿冯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布确徙。 她就那樣靜靜地躺著醒串,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鄙皇。 梳的紋絲不亂的頭發(fā)上芜赌,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天,我揣著相機(jī)與錄音伴逸,去河邊找鬼缠沈。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的洲愤。 我是一名探鬼主播颓芭,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼柬赐!你這毒婦竟也來了亡问?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤肛宋,失蹤者是張志新(化名)和其女友劉穎州藕,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酝陈,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡床玻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了后添。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笨枯。...
    茶點(diǎn)故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖遇西,靈堂內(nèi)的尸體忽然破棺而出馅精,到底是詐尸還是另有隱情,我是刑警寧澤粱檀,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布洲敢,位于F島的核電站,受9級特大地震影響茄蚯,放射性物質(zhì)發(fā)生泄漏压彭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一渗常、第九天 我趴在偏房一處隱蔽的房頂上張望壮不。 院中可真熱鬧,春花似錦皱碘、人聲如沸询一。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽健蕊。三九已至,卻和暖如春踢俄,著一層夾襖步出監(jiān)牢的瞬間缩功,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工都办, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嫡锌,地道東北人虑稼。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像势木,于是被迫代替她去往敵國和親动雹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評論 2 359

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