1. shiro過濾器/* = authc把自己寫的都攔截了,走了上面的攔截器後還是會被/*攔截
我也碰到這種情來況了,,自,發現filters.put("authc", filter_Authc());這種方式注入filter的時候,攔截順序會失效,,,要改成new xx()這種方式才可以filters.put("authc", new Filter_Authc());
2. Shiro中的filter
DefaultFilter
shiro中提供的默認filter
FilterChainManager
通過配置創建對應的filterChain
Shiro通過此配置可初始化FilterChainManager中的filterChain,結構為 url ->filter列表
SpringShiroFilter
入口filter,攔截所有請求,通過請求的url匹配到對應的filterChain,然後通過Chain對請求進行,認證或者授權的處理
OncePerRequestFilter
OncePerRequestFilter 用於防止多次執行 Filter;也就是說一次請求只會走一次攔截器鏈;
另外提供 enabled 屬性,表示是否開啟該攔截器實例
實現了 doFilter 方法,提供了抽象方法 doFilterInternal 。
在doFilter中驗證當前的Filter有沒有執行過,如果已經執行過一次或者當前filter被禁用,則直接執行下一個Filter。如果沒有執行過則執行 doFilterInternal 方法
AbstractShiroFilter
創建Subject,綁定subject到當前線程,根據url獲取filterChain並執行filterChain
通過請求的url來匹配FilterChainManager中的FilterChain,這個方法會返回一個 ProxiedFilterChain
ProxiedFilterChain
存儲了tomcat的Filter 和shiro內部的filter
shiro內部的過濾器執行完後會切換到tomcat的過濾器繼續執行
默認filter
除了LogoutFilter,其他都繼承了AdviceFilter
AdviceFilter
AdviceFilter 提供了 AOP 風格的支持,類似於 SpringMVC 中的 Interceptor:
許可權驗證在preHandle中實現
PathMatchingFilter
PathMatchingFilter 提供了基於 Ant 風格的請求路徑匹配功能及攔截器參數解析的功能,如
「 /admin roles[admin,user] 」自動根據 「,」 分割,解析成 /admin -> [admin,user] 存入 appliedPaths 中
實現了 preHandle 方法,通過請求的url匹配url對應的許可權,解析許可權串 調用子類的 onPreHandle 對許可權進行處理
AnonymousFilter
提供匿名訪問功能,實現了 onPreHandle 直接返回true,所以配置 anon 的url任何人都可以訪問
AccessControlFilter
提供了資源訪問控制的基礎功能
實現了 onPreHandle ,這里拆分出了
isAccessAllowed (是否允許訪問)和 onAccessDenied (訪問被拒絕時)這兩個方法供子類實現
AuthenticationFilter
實現了 isAccessAllowed 方法,驗證用戶是否已經登錄,沒有登錄將被拒絕
FormAuthenticationFilter
繼承自 AuthenticationFilter 只有用戶登錄過後才能通過
實現了 onAccessDenied 方法,如果請求的地址是登錄地址,這里會嘗試自動登錄,否則跳轉到登錄頁面
BasicHttpAuthenticationFilter
提供了基於 HttpBasic認證的方式
AuthorizationFilter
實現了 onAccessDenied 方法,如果沒有認證通過,則跳轉到登錄或者認證失敗的頁面
對用戶所訪問資源的許可權進行認證
HttpMethodPermissionFilter
將HTTP請求的方法(例如GET、POST等)轉換為相應的動作並構造一個相應的許可權
如get 被轉換為 read,put 轉換為 update,post轉換為create等
許可權配置:/users perms[users]
請求: get /users
將會驗證 用戶是否擁有users:read許可權
RolesAuthorizationFilter
驗證用戶是否用對對應的角色
UserFilter
實現了 isAccessAllowed 和 onAccessDenied 方法,驗證用戶是否登錄過,如果驗證未通過則跳轉到登錄頁面
3. springMvc+shiro做許可權管理,頁面上的靜態資源,樣式圖片等沒有出現,用幾種方式過濾試過,還是不行
正常情況是不會出現這樣的,shiro對於靜態資源的處理,不用特殊配置。
只需要在shiroFilter過濾器filterChainDefinitions項中增加一個靜態資源處理規則就可以,例如允許/css/開頭的資源匿名訪問,只需要這樣一句配置就足矣。
/css/** = anon
配置完成後,未登錄就可以在瀏覽器中直接訪問css下的資源,新項目用的shiro,簡單而又實用的許可權框架。