<a href="http://download.csdn.net/detail/bug_moving/9738002">shiro于ssm整合所有的jar包</a>
在web系統中,shiro也通過filter進行攔截。filter攔截後将操作權交給spring中配置的filterchain(過慮鍊兒)
shiro提供很多filter。
在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中配置
不用我們去實作退出,隻要去通路一個退出的url(該 url是可以不存在),由logoutfilter攔截住,清除session。
在applicationcontext-shiro.xml配置logoutfilter
使用permissionsauthorizationfilter
在applicationcontext-shiro.xml中配置url所對應的權限。
測試流程:
1、在applicationcontext-shiro.xml中配置filter規則
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緩存來解決。
過濾器簡稱 對應的java類
資料庫中存儲到的md5的散列值,在realm中需要設定資料庫中的散列值它使用雜湊演算法 及散列次數,讓shiro進行散列對比時和原始資料庫中的散列值使用的算法 一緻。
修改realm的dogetauthorizationinfo,從資料庫查詢權限資訊。
使用注解式授權方法。
使用jsp标簽授權方法。
對系統中類的方法給使用者授權,建議在controller層進行方法授權。
在springmvc.xml中配置
jsp頁面添加:
标簽名稱 标簽條件(均是顯示标簽内容)
修改itemslist.jsp頁面
當調用controller的一個方法,由于該 方法加了@requirespermissions(“item:query”) ,shiro調用realm擷取資料庫中的權限資訊,看”item:query”是否在權限資料中存在,如果不存在就拒絕通路,如果存在就授權通過。
當展示一個jsp頁面時,頁面中如果遇到<code><shiro:haspermission name="item:update"></code>,shiro調用realm擷取資料庫中的權限資訊,看item:update是否在權限資料中存在,如果不存在就拒絕通路,如果存在就授權通過。
問題:隻要遇到注解或jsp标簽的授權,都會調用realm方法查詢資料庫,需要使用緩存解決此問題。