javascript
java shirofilter_Spring项目集成ShiroFilter简单实现权限管理
Shiros是我們開發(fā)中常用的用來實現(xiàn)權(quán)限控制的一種工具包,它主要有認證、授權(quán)、加密、會話管理、與Web集成、緩存等功能。我是從事javaweb工作的,我就經(jīng)常遇到需要實現(xiàn)權(quán)限控制的項目,之前我們都是靠查詢數(shù)據(jù)獲取列表拼接展示的,還有的是及時的判斷權(quán)限的問題的,現(xiàn)在有了Shiros了,我們就可以統(tǒng)一的進行設(shè)置權(quán)限問題,Shrios的實現(xiàn)也是很簡單的,下面讓我們來看看具體實現(xiàn)步驟
web.xml配置
因為我們是與spring進行集成的,而spring的基本就是web項目的xml文件。所以我們在web.xml中配置shiros的過濾攔截。正常情況下,我們需要將shiro的filter配置在所有的filter前面,當然和encodingFilter這個filter是不區(qū)分前后的。因為兩者互相不影響的。
shiroFilter
org.springframework.web.filter.DelegatingFilterProxy
targetFilterLifecycle
true
shiroFilter
/*
好了,到這里shiro就集成到spring項目里面去了。What?對的,你妹看錯,就這么簡單,shiro就這一步就集成到項目里了。集成式集成了,但是想要完整的實現(xiàn)效果當然我們還是需要繼續(xù)的往下配置的。在這里請記住我這里的shiroq過濾器的名字叫shiroFilter(后面有用的)。下面我們的shiro需要到spring的配置文件application.xml文件里去配置,在我的項目的我的spring配置文件是spring-service.xml。而在spring-service.xml中又引入了spring-shiro.xml,也就是說最后shiro的配置是配置在spring-shiro.xml文件中。
最終源碼在最后下載
spring-shiro.xml
這里我們將來看看spring-shiro.xml的配置,這里我采取倒敘的方式講解,我覺的倒敘更加的有助于我們理解代碼。首先我們還記得在web.xml中配置的那個filter吧,名字shiroFilter,對spring-shiro.xml配置文件就是通過這個filter展開的。首先我們在web.xml配置的過濾器實際上是配置ShiroFilterFactoryBean,所以在這里需要將ShiroFilterFactoryBean定義為shiroFilter
/>
/statics/**=anon
/login.html=anon
/sys/schedule.html=perms[sys:schedule:save]
/sys/login=anon
/captcha.jpg=anon
/**=authc
具體的上面的代碼注釋已經(jīng)解釋的很清楚了,在這里主要講解下filterChainDefinitions里面的設(shè)置屬性。里面的value就是我們控制的頁面權(quán)限設(shè)置。filterChainDefinitions的原則是按順序查找一旦查找到符合的頁面要求就不在繼續(xù)查找了。所以我們需要將有通配符的頁面設(shè)置在最后。上面配置中有/sys/schedule.html=perms[sys:schedule:save]
意思就是說訪問schedule.html這個頁面前提是你得有sys:schedule:save這個權(quán)限。至于這個權(quán)限在哪里配置。在這里先透露一下。在Realm中獲取
在上面的配置我們securityManager屬性是shiro 安全核心配置接口,這里需要我們自己填寫,這里的配置就是需要我們實現(xiàn)我們的認證,因為不同的項目我們認證權(quán)限肯定是不一樣的。所以這也是shiro給我們唯一為數(shù)不多的代碼編寫的接口,我們只需要在這接口提供我們自己的認證和角色權(quán)限分配就行了。
那么這里有出現(xiàn)了一個realm,這個realm就是我們實現(xiàn)權(quán)限和認證的地方。我們只需要通過spring將我們的實現(xiàn)類指定為realm即可
在講UserRealm之前我們先來看看shir默認的realm邏輯是咋樣的
通常我們只需要繼承AuthorizingRealm(授權(quán)),因為AuthorizingRealm里面繼承了AuthenticatingRealm(認證),所以我們只需要繼承AuthorizingRealm(授權(quán)),我們就可以重寫授權(quán)和認證兩個方法了,這兩個方法里面就實現(xiàn)權(quán)限管理操作。
首先來看看在認證登錄中我們有哪些值得注意的地方
doGetAuthenticationInfo中實現(xiàn)登錄認證出現(xiàn)的幾種異常
UnknownAccountException:獲取的user為空
LockedAccountException :此用戶被鎖住了
IncorrectCredentialsException : 密碼不正確(建議提示為 用戶名或密碼錯誤。安全考慮)
ExcessiveAttemptsException : 密碼錯誤次數(shù)太多(現(xiàn)在很多網(wǎng)站上都有相關(guān)的操作)
最后通過用戶名+明文密碼+Reaml中的getName進行用戶信息組裝
登錄認證就這幾點注意,其次就是權(quán)限分配了,doGetAuthorizationInfo(授權(quán)),在doGetAuthorizationInfo里我們通過PrincipalCollection這個身份集合,當我們只配置了一個Reaml的時候我們可以通過PrincipalCollection中的getPrimaryPrincipal方法獲得剛剛傳入的Reaml(用戶名)就行了,但是當我們配置了多個Reaml的時候可以通過PrincipalCollection中的getRealmNames獲取所有的Reaml的用戶名就行了。
然后通過用戶名去數(shù)據(jù)庫獲取權(quán)限菜單。最后返回一個帶有角色和權(quán)限的 SimpleAuthorization的信息,意思就是一下角色具有哪些權(quán)限。如果就一個角色的時候也可以不指定角色,分別通過setStringPermissions(指定權(quán)限)+setRoles(指定角色)
到這里shiro的配置就完成了。
另外還有一點shiro的配置是處理shiro的生命周期和shiro的注解的啟用的,這里就不解釋了,直接上代碼
spring-shiro.xml源碼
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
/>
/statics/**=anon
/login.html=anon
/sys/schedule.html=perms[sys:schedule:save]
/sys/login=anon
/captcha.jpg=anon
/**=authc
Shiro的其他權(quán)限過濾器及其用法
anon :org.apache.shiro.web.filter.authc.AnonymousFilter
/statics/**=anon :以statics開頭的請求可以隨便訪問,沒有權(quán)限
authc:org.apache.shiro.web.filter.authc.FormAuthenticationFilter
/**=authc :表示所有的請求都需要進行驗證權(quán)限且權(quán)限通過才能放行
authcBasic:org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
/admins/user/**=authcBasic :表示沒有通過httpbasic認證的
perms:org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
/admins/user/*=perms[user:add:] :上面已經(jīng)解釋過了,表示訪問./admins/user/..
的請求必須是由use:add:*權(quán)限的才可以訪問,否則重定向登錄頁面(這里的登錄頁面默認是web下的login.html,正常我們通過設(shè)置shiro中的filterChainDefinitions屬性設(shè)置頁面)。
port : org.apache.shiro.web.filter.authz.PortFilter
/admins/user/**=port[8081] :
當訪問的請求端口不是8001時,則shiro會重定向到schemal://serverName:8081?queryString請求。這個請求中schemal是http或者https,serverName是我們原請求中的域名,8081就是我們port里設(shè)置端口號,queryString是我們原請求中攜帶的參數(shù)。
rest :org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter
/admins/user/**=rest[user] :
rest表示請求方法。相當于perms[user:method],這里method值得是post,get , delete.
roles :org.apache.shiro.web.filter.authz.RolesAuthorizationFilter
/admins/user/**=roles[admin] :
這個和perms使用時一樣的,只不過在后臺我們是通過setRoles方法給用戶設(shè)置角色的。
ssl : org.apache.shiro.web.filter.authz.SslFilter
/admins/user/**=ssl : 表示該請求是安全請求,協(xié)議是https
user : org.apache.shiro.web.filter.authc.UserFilter
/admins/user/**=user 表示必須存在用戶,在登錄操作是不進行檢查的,因為登錄的時候根本就不存在用戶。
logout : org.apache.shiro.web.filter.authc.LogoutFilter
/admins/user/**=logout : 表示該請求是退出操作
注意!上面中roles,perms,rest這三個里面是可以帶參數(shù)的,如果有多個參數(shù)參數(shù)之間必須用英文裝填下的逗號分隔。在頁面中判斷是所有參數(shù)都滿足才算是滿足的。
以上是自己根據(jù)別的文章加上自己認識總結(jié),參考一下文章
總結(jié)
以上是生活随笔為你收集整理的java shirofilter_Spring项目集成ShiroFilter简单实现权限管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 在表格中批量显示图片
- 下一篇: 如何用命令隐藏文件夹
