本篇文章主要是對權(quán)限框架shiro的一個小總結(jié)。寫的不對的地方或者哪里需要修改的歡迎大家給出意見拇厢。
shiro是什么
? ? ? Apache Shiro是一個強(qiáng)大且易用的Java安全框架,執(zhí)行身份驗證、授權(quán)杭煎、密碼學(xué)和會話管理纽哥。使用Shiro的易于理解的API,您可以快速、輕松地獲得任何應(yīng)用程序,從最小的移動應(yīng)用程序到最大的網(wǎng)絡(luò)和企業(yè)應(yīng)用程序代箭。
主要功能
三個核心組件:Subject, SecurityManager 和 Realms.
Subject:即“當(dāng)前操作用戶”墩划。但是,在Shiro中嗡综,Subject這一概念并不僅僅指人乙帮,也可以是第三方進(jìn)程、后臺帳戶(Daemon Account)或其他類似事物极景。它僅僅意味著“當(dāng)前跟軟件交互的東西”察净。但考慮到大多數(shù)目的和用途,你可以把它認(rèn)為是Shiro的“用戶”概念盼樟。
Subject代表了當(dāng)前用戶的安全操作氢卡,SecurityManager則管理所有用戶的安全操作。
SecurityManager:它是Shiro框架的核心恤批,典型的Facade模式废赞,Shiro通過SecurityManager來管理內(nèi)部組件實例鉴吹,并通過它來提供安全管理的各種服務(wù)打颤。
Realm: Realm充當(dāng)了Shiro與應(yīng)用安全數(shù)據(jù)間的“橋梁”或者“連接器”错妖。也就是說,當(dāng)對用戶執(zhí)行認(rèn)證(登錄)和授權(quán)(訪問控制)驗證時纯蛾,Shiro會從應(yīng)用配置的Realm中查找用戶及其權(quán)限信息。
從這個意義上講,Realm實質(zhì)上是一個安全相關(guān)的DAO:它封裝了數(shù)據(jù)源的連接細(xì)節(jié)睛竣,并在需要時將相關(guān)數(shù)據(jù)提供給Shiro。當(dāng)配置Shiro時求摇,你必須至少指定一個Realm射沟,用于認(rèn)證和(或)授權(quán)。配置多個Realm是可以的与境,但是至少需要一個验夯。
Shiro內(nèi)置了可以連接大量安全數(shù)據(jù)源(又名目錄)的Realm,如LDAP摔刁、關(guān)系數(shù)據(jù)庫(JDBC)挥转、類似INI的文本配置資源以及屬性文件等。如果缺省的Realm不能滿足需求共屈,你還可以插入代表自定義數(shù)據(jù)源的自己的Realm實現(xiàn)绑谣。
為什么要使用shiro?
? ???shiro 的安全拗引,圍繞著 2點來借宵, ?1 是 角色 2是權(quán)限
? ? ?我們通常是角色對應(yīng)一組權(quán)限,他這邊不是的矾削。
? ? ? 我們系統(tǒng)中角色不是固定的壤玫,但是權(quán)限是固定的,比如 ? ?角色允許動態(tài)去創(chuàng)建怔软,因此我們只可以拿權(quán)限來判斷
? ? ? ?比如 ?useraction ?里面的add 方法 ?我可以通過 ?一個注解 ?參數(shù)為 user:add 代表 ?shiro ?維護(hù)的當(dāng)前請求用戶的 這個人只要有?user:add ?就可以了垦细。
? ? ? ?比如 ?useraction 里面有一個 findbean (獲取一個bean的信息) ? 又有一個listdata(獲取列表數(shù)據(jù)) ?他們都是查看權(quán)限 ?他們的注解加入同一個 user:see 就可以了
? ? ? 如果用傳統(tǒng)的url攔截我們需要給 findbean 和 listdata 各配置一個url權(quán)限(他們是不同的url),很顯然用shiro ?去做這件事更方便一些挡逼。
? ? ? 另外括改,比較好的就是shiro ? 自帶了前臺的標(biāo)簽
? ? ? 我們在列表頁面 ? 的添加按鈕,動態(tài)判斷是否有 user:add 這個權(quán)限家坎,如果有才給他顯示嘱能, ? 不用shiro ? 我們需要自己寫一個標(biāo)簽,現(xiàn)在shiro ? 自帶標(biāo)簽虱疏。
shiro的簡單demo
? ?工具說明: 這里樓主使用的開發(fā)工具是IntelliJ IDEA惹骂,jdk用的1.8
? ? 代碼說明:
? ? ? ? 首先加入shiro的依賴包。樓主使用的maven來進(jìn)行管理
添加shiro的XML 配置
若果是web項目做瞪,還需要在web.xml文件中配置shiro的filter对粪。
自己可以重寫relam類右冻,定義自己的權(quán)限規(guī)范,這里也相當(dāng)于是shiro使用的一個重點著拭。繼承?org.apache.shiro.realm.AuthorizingRealm;這個類纱扭。并且重寫其中的doGetAuthorizationInfo以及doGetAuthenticationInfo方法。第一個方法是對用戶授權(quán)儡遮,第二個方法是對用戶進(jìn)行認(rèn)證乳蛾。
shiro的驗證原理分析:shiro 登錄驗證的時候會封裝一個subject。然后我們可以通過這個subject 的用戶名或者其他標(biāo)致來查詢是否擁有這個用戶鄙币,如果沒有的話會拋出一個??? org.apache.shiro.authc.UnknownAccountException 肃叶。然后通過這個用戶名或者其他標(biāo)志從數(shù)據(jù)庫查出來的實體類做比較。如果符合則返回一個AuthenticationInfo十嘿。沒有驗證成功則拋出一系列異常因惭。
?異常總結(jié):
<-- 身份認(rèn)證異常?-->?
<--身份令牌異常详幽,不支持的身份令牌-->
org.apache.shiro.authc.pam.UnsupportedTokenException ?
<--?未知賬戶/沒找到帳號,登錄失敗-->
org.apache.shiro.authc.UnknownAccountException ?
<--帳號鎖定-->
org.apache.shiro.authc.LockedAccountException ?
<--用戶禁用-->
org.apache.shiro.authc.DisabledAccountException ?
<--登錄重試次數(shù)筛欢,超限浸锨。只允許在一段時間內(nèi)允許有一定數(shù)量的認(rèn)證嘗試-->
org.apache.shiro.authc.ExcessiveAttemptsException ?
<--一個用戶多次登錄異常:不允許多次登錄唇聘,只能登錄一次?。即不允許多處登錄--->
org.apache.shiro.authc.ConcurrentAccessException ?
<--?賬戶異常-->
org.apache.shiro.authc.AccountException ?
<--過期的憑據(jù)異常-->
org.apache.shiro.authc.ExpiredCredentialsException ?
<---?錯誤的憑據(jù)異常 -->
org.apache.shiro.authc.IncorrectCredentialsException ?
<--憑據(jù)異常-->
org.apache.shiro.authc.CredentialsException ?
org.apache.shiro.authc.AuthenticationException ?
<--權(quán)限異常-->
<--沒有訪問權(quán)限柱搜,訪問異常?-->
org.apache.shiro.authz.HostUnauthorizedException ?
org.apache.shiro.authz.UnauthorizedException ?
? <--?授權(quán)異常?-->??
org.apache.shiro.authz.UnauthenticatedException ?
org.apache.shiro.authz.AuthorizationException ?
<--?shiro全局異常?-->??
org.apache.shiro.ShiroException
shiro的授權(quán)分析:shiro的授權(quán)主要是利用角色和權(quán)限信息來控制用戶的權(quán)限迟郎,通過每一個角色的不同來確定對應(yīng)的權(quán)限〈险海可以配置多個數(shù)據(jù)源relam來處理權(quán)限宪肖;