天天看點

【Shiro學習筆記】二、Shiro過濾器執行鍊路梳理(認證和授權)一、前言二、Shiro過濾器是如何加入Spring容器中的三、過濾器作用四、過濾器執行鍊路梳理五、認證和授權過濾器的執行優先級

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類圖如下:

【Shiro學習筆記】二、Shiro過濾器執行鍊路梳理(認證和授權)一、前言二、Shiro過濾器是如何加入Spring容器中的三、過濾器作用四、過濾器執行鍊路梳理五、認證和授權過濾器的執行優先級

三、過濾器作用

1、認證過濾器(FormAuthenticationFilter)

可以指定某些url,必須登入後才可進行通路,否則拒絕通路。

2、授權過濾器(RolesAuthorizationFilter)

可以指定某些url,必須具有哪些role角色,才可進行通路,否則拒絕通路

四、過濾器執行鍊路梳理

1、由最上面的UML類圖中可知,Shiro過濾器的入口方法為OncePerRequestFilter中的doFilter方法,到具體過濾器的執行鍊路如下:

【Shiro學習筆記】二、Shiro過濾器執行鍊路梳理(認證和授權)一、前言二、Shiro過濾器是如何加入Spring容器中的三、過濾器作用四、過濾器執行鍊路梳理五、認證和授權過濾器的執行優先級

2、其中,RolesAuthorizationFilter的isAccessAllowed方法,最終會執行到業務Realm的 doGetAuthorizationInfo 方法(授權方法)

【Shiro學習筆記】二、Shiro過濾器執行鍊路梳理(認證和授權)一、前言二、Shiro過濾器是如何加入Spring容器中的三、過濾器作用四、過濾器執行鍊路梳理五、認證和授權過濾器的執行優先級

3、業務Realm 的 doGetAuthenticationInfo 方法(認證方法),是在登入Controller中調用 subject.login 方法,最終執行到的

【Shiro學習筆記】二、Shiro過濾器執行鍊路梳理(認證和授權)一、前言二、Shiro過濾器是如何加入Spring容器中的三、過濾器作用四、過濾器執行鍊路梳理五、認證和授權過濾器的執行優先級

五、認證和授權過濾器的執行優先級

從測試效果來看,shiro中的授權過濾器,執行優先級比認證過濾器要高:

先進入了授權過濾器,再進入了認證過濾器。

通過檢視AdviceFilter源碼,發現doFilterInternal方法如下,與上面描述相符。

【Shiro學習筆記】二、Shiro過濾器執行鍊路梳理(認證和授權)一、前言二、Shiro過濾器是如何加入Spring容器中的三、過濾器作用四、過濾器執行鍊路梳理五、認證和授權過濾器的執行優先級
下一篇: 11.5.4