日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

java shirofilter_Spring项目集成ShiroFilter简单实现权限管理

發布時間:2025/3/15 javascript 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java shirofilter_Spring项目集成ShiroFilter简单实现权限管理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Shiros是我們開發中常用的用來實現權限控制的一種工具包,它主要有認證、授權、加密、會話管理、與Web集成、緩存等功能。我是從事javaweb工作的,我就經常遇到需要實現權限控制的項目,之前我們都是靠查詢數據獲取列表拼接展示的,還有的是及時的判斷權限的問題的,現在有了Shiros了,我們就可以統一的進行設置權限問題,Shrios的實現也是很簡單的,下面讓我們來看看具體實現步驟

web.xml配置

因為我們是與spring進行集成的,而spring的基本就是web項目的xml文件。所以我們在web.xml中配置shiros的過濾攔截。正常情況下,我們需要將shiro的filter配置在所有的filter前面,當然和encodingFilter這個filter是不區分前后的。因為兩者互相不影響的。

shiroFilter

org.springframework.web.filter.DelegatingFilterProxy

targetFilterLifecycle

true

shiroFilter

/*

好了,到這里shiro就集成到spring項目里面去了。What?對的,你妹看錯,就這么簡單,shiro就這一步就集成到項目里了。集成式集成了,但是想要完整的實現效果當然我們還是需要繼續的往下配置的。在這里請記住我這里的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

具體的上面的代碼注釋已經解釋的很清楚了,在這里主要講解下filterChainDefinitions里面的設置屬性。里面的value就是我們控制的頁面權限設置。filterChainDefinitions的原則是按順序查找一旦查找到符合的頁面要求就不在繼續查找了。所以我們需要將有通配符的頁面設置在最后。上面配置中有/sys/schedule.html=perms[sys:schedule:save]

意思就是說訪問schedule.html這個頁面前提是你得有sys:schedule:save這個權限。至于這個權限在哪里配置。在這里先透露一下。在Realm中獲取

在上面的配置我們securityManager屬性是shiro 安全核心配置接口,這里需要我們自己填寫,這里的配置就是需要我們實現我們的認證,因為不同的項目我們認證權限肯定是不一樣的。所以這也是shiro給我們唯一為數不多的代碼編寫的接口,我們只需要在這接口提供我們自己的認證和角色權限分配就行了。

那么這里有出現了一個realm,這個realm就是我們實現權限和認證的地方。我們只需要通過spring將我們的實現類指定為realm即可

在講UserRealm之前我們先來看看shir默認的realm邏輯是咋樣的

通常我們只需要繼承AuthorizingRealm(授權),因為AuthorizingRealm里面繼承了AuthenticatingRealm(認證),所以我們只需要繼承AuthorizingRealm(授權),我們就可以重寫授權和認證兩個方法了,這兩個方法里面就實現權限管理操作。

首先來看看在認證登錄中我們有哪些值得注意的地方

doGetAuthenticationInfo中實現登錄認證出現的幾種異常

UnknownAccountException:獲取的user為空

LockedAccountException :此用戶被鎖住了

IncorrectCredentialsException : 密碼不正確(建議提示為 用戶名或密碼錯誤。安全考慮)

ExcessiveAttemptsException : 密碼錯誤次數太多(現在很多網站上都有相關的操作)

最后通過用戶名+明文密碼+Reaml中的getName進行用戶信息組裝

登錄認證就這幾點注意,其次就是權限分配了,doGetAuthorizationInfo(授權),在doGetAuthorizationInfo里我們通過PrincipalCollection這個身份集合,當我們只配置了一個Reaml的時候我們可以通過PrincipalCollection中的getPrimaryPrincipal方法獲得剛剛傳入的Reaml(用戶名)就行了,但是當我們配置了多個Reaml的時候可以通過PrincipalCollection中的getRealmNames獲取所有的Reaml的用戶名就行了。

然后通過用戶名去數據庫獲取權限菜單。最后返回一個帶有角色和權限的 SimpleAuthorization的信息,意思就是一下角色具有哪些權限。如果就一個角色的時候也可以不指定角色,分別通過setStringPermissions(指定權限)+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的其他權限過濾器及其用法

anon :org.apache.shiro.web.filter.authc.AnonymousFilter

/statics/**=anon :以statics開頭的請求可以隨便訪問,沒有權限

authc:org.apache.shiro.web.filter.authc.FormAuthenticationFilter

/**=authc :表示所有的請求都需要進行驗證權限且權限通過才能放行

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:] :上面已經解釋過了,表示訪問./admins/user/..

的請求必須是由use:add:*權限的才可以訪問,否則重定向登錄頁面(這里的登錄頁面默認是web下的login.html,正常我們通過設置shiro中的filterChainDefinitions屬性設置頁面)。

port : org.apache.shiro.web.filter.authz.PortFilter

/admins/user/**=port[8081] :

當訪問的請求端口不是8001時,則shiro會重定向到schemal://serverName:8081?queryString請求。這個請求中schemal是http或者https,serverName是我們原請求中的域名,8081就是我們port里設置端口號,queryString是我們原請求中攜帶的參數。

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方法給用戶設置角色的。

ssl : org.apache.shiro.web.filter.authz.SslFilter

/admins/user/**=ssl : 表示該請求是安全請求,協議是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這三個里面是可以帶參數的,如果有多個參數參數之間必須用英文裝填下的逗號分隔。在頁面中判斷是所有參數都滿足才算是滿足的。

以上是自己根據別的文章加上自己認識總結,參考一下文章

總結

以上是生活随笔為你收集整理的java shirofilter_Spring项目集成ShiroFilter简单实现权限管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。