當(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.配置依賴:
2.編寫前端頁面路勁要注意:src/main/resouces/templates
這里還有其他頁面可以自己隨便寫兩個就行
3.編寫啟動類:
4.編寫HomeController類
上面都是最簡單的小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類中方法如圖:
這里要解釋一下:
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如圖:
b如圖:
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ù)。
這里寫過記得加上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類用戶類的持久化
這里還要編寫調(diào)用這個方法的類亡电,這里用mvc模式份乒,一個接口一個實(shí)現(xiàn)類:
其實(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)證用戶輸入的賬號和密碼是否正確煌集。(如圖)
至于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中群井。
身份認(rèn)證基本完成了還要在homeController哪里加上login post處理
這里登錄肯定還會報錯因?yàn)槲覀兠艽a是用密文方式加密還要編寫一個方法類ShiroConfiguration:
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