shiro與SSM專案整合
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]
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" %>
標籤名稱 標籤條件(均是顯示標籤內容)
<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"/> 顯示使用者身份中的屬性值
修改itemsList.jsp頁面
授權測試
當呼叫controller的一個方法,由於該 方法加了@RequiresPermissions(“item:query”) ,shiro呼叫realm獲取資料庫中的許可權資訊,看”item:query”是否在許可權資料中存在,如果不存在就拒絕訪問,如果存在就授權通過。
當展示一個jsp頁面時,頁面中如果遇到<shiro:hasPermission name="item:update">
,shiro呼叫realm獲取資料庫中的許可權資訊,看item:update是否在許可權資料中存在,如果不存在就拒絕訪問,如果存在就授權通過。
問題:只要遇到註解或jsp標籤的授權,都會呼叫realm方法查詢資料庫,需要使用快取解決此問題。