實(shí)現(xiàn)流程
- 我們在 Spring-shiro.xml 中配置過濾規(guī)則.
<!--商品查詢需要商品查詢權(quán)限 森枪,取消url攔截配置,使用注解授權(quán)方式 -->
/items/queryItems.action = perms[item:query]
如果有多個(gè)權(quán)限, 用逗號分隔perms[item:query,.....]
- 用戶在認(rèn)證通過后,請求
/items/queryItems.action
url - 被
PermissionsAuthorizationFilter
攔截, 攔截后發(fā)現(xiàn)需要item:query
權(quán)限. -
PermissionsAuthorizationFilter
調(diào)用 realm 中的doGetAuthorizationInfo
方法.獲取數(shù)據(jù)庫正確權(quán)限. -
PermissionsAuthorizationFilter
對item:query
權(quán)限 和 從 realm 中獲取的權(quán)限進(jìn)行對比, 如果item:query
在 realm 返回的權(quán)限列表中, 則授權(quán)通過.
注意: 如果授權(quán)失敗會跳轉(zhuǎn)到refuse.jsp
頁面.
<!-- 通過unauthorizedUrl指定沒有權(quán)限操作時(shí)跳轉(zhuǎn)頁面-->
<property name="unauthorizedUrl" value="/refuse.jsp" />
問題總結(jié)
- 在 spring-shiro.xml 中配置過濾器鏈接, 需要將全部 URL 和權(quán)限對應(yīng)起來進(jìn)行配置, 比較麻煩.
- 每次授權(quán)都需要調(diào)用 realm 查詢數(shù)據(jù), 對系統(tǒng)性能有很大影響, 可以通過 shiro 緩存來解決.