1. 程式人生 > >Shiro與SSH整合

Shiro與SSH整合

web.xml中配置shiro的filter

在web系統中,shiro也通過filter進行攔截。filter攔截後將操作權交給spring中配置的filterChain(過慮鏈兒) 
shiro提供很多filter。

這裡寫圖片描述

applicationContext-shiro.xml

在applicationContext-shiro.xml 中配置web.xml中fitler對應spring容器中的bean。

這裡寫圖片描述

靜態資源

對靜態資源設定逆名訪問: 
修改applicationContext-shiro.xml

這裡寫圖片描述

登陸

原理

使用FormAuthenticationFilter過慮器實現 ,原理如下:

將使用者沒有認證時,請求loginurl進行認證,使用者身份和使用者密碼提交資料到loginurl 
FormAuthenticationFilter攔截住取出request中的username和password(兩個引數名稱是可以配置的) 
FormAuthenticationFilter呼叫realm傳入一個token(username和password) 
realm認證時根據username查詢使用者資訊(在Activeuser中儲存,包括 userid、usercode、username、menus)。 
如果查詢不到,realm返回null,FormAuthenticationFilter向request域中填充一個引數(記錄了異常資訊)

在登入頁面中,由於FormAuthenticationFilter的使用者身份和密碼的input的預設值(username和password),修改頁面的賬號和密碼 的input的名稱為username和password

這裡寫圖片描述

認證攔截過慮器

在applicationContext-shiro.xml中配置

這裡寫圖片描述

退出

使用LogoutFilter

不用我們去實現退出,只要去訪問一個退出的url(該 url是可以不存在),由LogoutFilter攔截住,清除session。

在applicationContext-shiro.xml配置LogoutFilter

這裡寫圖片描述

授權過慮器測試

使用PermissionsAuthorizationFilter

在applicationContext-shiro.xml中配置url所對應的許可權。

測試流程: 
1、在applicationContext-shiro.xml中配置filter規則

<!--商品查詢需要商品查詢許可權  -->
    /items/queryItems.action = perms[item:query]
  • 1
  • 2
  • 1
  • 2

2、使用者在認證通過後,請求/items/queryItems.action 
3、被PermissionsAuthorizationFilter攔截,發現需要“item:query”許可權 
4、PermissionsAuthorizationFilter呼叫realm中的doGetAuthorizationInfo獲取資料庫中正確的許可權 
5、PermissionsAuthorizationFilter對item:query 和從realm中獲取許可權進行對比,如果“item:query”在realm返回的許可權列表中,授權通過。

問題總結

1、在applicationContext-shiro.xml中配置過慮器連結,需要將全部的url和許可權對應起來進行配置,比較發麻不方便使用。

2、每次授權都需要呼叫realm查詢資料庫,對於系統性能有很大影響,可以通過shiro快取來解決。

shiro的過慮器

過濾器簡稱 對應的Java

anon    org.apache.shiro.web.filter.authc.AnonymousFilter
authc   org.apache.shiro.web.filter.authc.FormAuthenticationFilter
authcBasic      org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
perms   org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
port    org.apache.shiro.web.filter.authz.PortFilter
rest    org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter
roles   org.apache.shiro.web.filter.authz.RolesAuthorizationFilter
ssl org.apache.shiro.web.filter.authz.SslFilter
user    org.apache.shiro.web.filter.authc.UserFilter
logout  org.apache.shiro.web.filter.authc.LogoutFilter

anon:例子/admins/**=anon 沒有引數,表示可以匿名使用。
authc:例如/admins/user/**=authc表示需要認證(登入)才能使用,FormAuthenticationFilter是表單認證,沒有引數 
perms:例子/admins/user/**=perms[user:add:*],引數可以寫多個,多個時必須加上引號,並且引數之間用逗號分割,例如/admins/user/**=perms["user:add:*,user:modify:*"],當有多個引數時必須每個引數都通過才通過,想當於isPermitedAll()方法。
user:例如/admins/user/**=user沒有引數表示必須存在使用者, 身份認證通過或通過記住我認證通過的可以訪問,當登入操作時不做檢查

認證

設定憑證匹配器

資料庫中儲存到的md5的雜湊值,在realm中需要設定資料庫中的雜湊值它使用雜湊演算法 及雜湊次數,讓shiro進行雜湊對比時和原始資料庫中的雜湊值使用的演算法 一致。

這裡寫圖片描述

授權

修改realm的doGetAuthorizationInfo,從資料庫查詢許可權資訊。 
使用註解式授權方法。 
使用jsp標籤授權方法。

開啟controller類aop支援

對系統中類的方法給使用者授權,建議在controller層進行方法授權。

在springmvc.xml中配置

這裡寫圖片描述

在controller方法中添加註解

這裡寫圖片描述

jsp標籤 授權

Jsp頁面新增:

<%@ tagliburi="http://shiro.apache.org/tags" prefix="shiro" %>
  • 1
  • 1

標籤名稱 標籤條件(均是顯示標籤內容)

<shiro:authenticated>   登入之後
<shiro:notAuthenticated>    不在登入狀態時
<shiro:guest>   使用者在沒有RememberMe時
<shiro:user>    使用者在RememberMe時
<shiro:hasAnyRoles name="abc,123" > 在有abc或者123角色時
<shiro:hasRole name="abc">  擁有角色abc
<shiro:lacksRole name="abc">    沒有角色abc
<shiro:hasPermission name="abc">    擁有許可權資源abc
<shiro:lacksPermission name="abc">  沒有abc許可權資源
<shiro:principal>   顯示使用者身份名稱
 <shiro:principal property="username"/>     顯示使用者身份中的屬性值
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

修改itemsList.jsp頁面

這裡寫圖片描述

授權測試

當呼叫controller的一個方法,由於該 方法加了@RequiresPermissions(“item:query”) ,shiro呼叫realm獲取資料庫中的許可權資訊,看”item:query”是否在許可權資料中存在,如果不存在就拒絕訪問,如果存在就授權通過。

當展示一個jsp頁面時,頁面中如果遇到<shiro:hasPermission name="item:update">,shiro呼叫realm獲取資料庫中的許可權資訊,看item:update是否在許可權資料中存在,如果不存在就拒絕訪問,如果存在就授權通過。

問題:只要遇到註解或jsp標籤的授權,都會呼叫realm方法查詢資料庫,需要使用快取解決此問題。