PS:歡迎轉載,但請注明出處,謝謝配合。
Shiro過濾器執行鍊路梳理
- 一、前言
- 二、Shiro過濾器是如何加入Spring容器中的
- 三、過濾器作用
-
- 1、認證過濾器(FormAuthenticationFilter)
- 2、授權過濾器(RolesAuthorizationFilter)
- 四、過濾器執行鍊路梳理
- 五、認證和授權過濾器的執行優先級
一、前言
本文章主要針對認證過濾器(FormAuthenticationFilter)和授權過濾器(RolesAuthorizationFilter),說明Shiro過濾器攔截到請求後,是如何一步步執行到認證過濾器和授權過濾器中的方法,最終調用到Realm中的方法。
補充說明:文章中的源碼,基于shiro-web-1.4.0.jar(通過shiro-spring-1.4.0.jar傳遞依賴而來)。
二、Shiro過濾器是如何加入Spring容器中的
Shiro內建時,會定義一個bean: ShiroFilterFactoryBean,實作了FactoryBean接口,根據spring原理可知,實作該接口的類傳回給spring容器的bean實際是調用getObject()方法傳回的。該方法最後傳回的是一個SpringShiroFilter,其父類實作了javax.servlet.Filter接口(web應用過濾器接口),進而将shiro過濾器加入到了springboot應用中,進而添加到servelt容器中進行攔截請求。
具體UML類圖如下:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZj91YpB3In5GcugjM5QjM1QTMyETMxAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
三、過濾器作用
1、認證過濾器(FormAuthenticationFilter)
可以指定某些url,必須登入後才可進行通路,否則拒絕通路。
2、授權過濾器(RolesAuthorizationFilter)
可以指定某些url,必須具有哪些role角色,才可進行通路,否則拒絕通路
四、過濾器執行鍊路梳理
1、由最上面的UML類圖中可知,Shiro過濾器的入口方法為OncePerRequestFilter中的doFilter方法,到具體過濾器的執行鍊路如下:
2、其中,RolesAuthorizationFilter的isAccessAllowed方法,最終會執行到業務Realm的 doGetAuthorizationInfo 方法(授權方法)
3、業務Realm 的 doGetAuthenticationInfo 方法(認證方法),是在登入Controller中調用 subject.login 方法,最終執行到的
五、認證和授權過濾器的執行優先級
從測試效果來看,shiro中的授權過濾器,執行優先級比認證過濾器要高:
先進入了授權過濾器,再進入了認證過濾器。
通過檢視AdviceFilter源碼,發現doFilterInternal方法如下,與上面描述相符。