<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在前面的文章中,我介紹瞭如何使用 Apache Shiro 進行安全認證。 其實 Shiro 在 Web 應用中出現的頻率更高。 今天我將來分析下,Shiro 是如何應用到 Web 應用中的。
Servlet 規範中定義了 Filter 和 FilterChain 介面,其中都包含一個 doFilter 方法,不過引數有區別:
Filter#doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
FilterChain#doFilter(ServletRequest request, ServletResponse response)
Tomcat 中對 FilterChain 的實現是 org.apache.catalina.core.ApplicationFilterChain
,它包括:
ApplicationFilterConfig[] filters;
陣列,用來儲存鏈中的 Filter,ApplicationFilterConfig 是 Filter 的設定類,通過 ApplicationFilterConfig#getFilter() 可獲得對應的 Filter。int pos;
表示鏈當前位置。int n;
表示 FilterChain 中 Filter 的數量,即 filters 中元素數量。Servlet servlet;
表示應用的 Servlet 實現。ApplicationFilterChain#doFilter 的實現邏輯:
pos < n
,即尚未執行到連結串列末端,則呼叫 filters[pos++].getFilter().doFilter(req, res, chain)
,執行當前 Filter 的 doFilter 方法。pos >= n
,說明連結串列中所有的 Filter 都執行完畢,則呼叫 servlet.service(request, response);
,執行業務層邏輯。綜上,ApplicationFilterChain 會檢查是否有 Filter 需要執行,如果有,則呼叫 Filter;否則,則將請求交給 Servlet 處理。 Filter 在其 doFilter 方法中,能夠拿到當前 Filter 所述的 FilterChain 物件。 在執行完 Filter 後,根據自身邏輯判斷是否需要繼續將請求傳遞給 chain 上的後續 Filter 處理,若需要,則呼叫 chain 的 doFilter 方法。
Shiro 中對 FilterChain 的實現是 org.apache.shiro.web.servlet.ProxiedFilterChain
,它包括:
FilterChain orig;
它是 Tomcat 中的 FilterChain 範例。List<Filter> filters;
是 Shiro 中要執行的安全相關的 Filter(它們也都是實現了 Servlet Filter 的類)。int index;
與 ApplicationFilterChain 中的 pos 異曲同工之妙。ProxiedFilterChain#doFilter 的實現邏輯:
filters == null || index = filters.size()
說明 Shiro 中安全相關的鏈已執行完畢,則呼叫 orig.doFilter(req, res)
filters.get(index++).doFilter(request, response, this);
org.apache.shiro.web.servlet.OncePerRequestFilter 實現了 Servlet 中的 Filter 介面,org.apache.shiro.web.servlet.AbstractShiroFilter 是 OncePerRequestFilter 的基本實現。 因此,AbstractShiroFilter 的派生類都能作為 Filter 新增到 Servlet 的責任鏈中,即 ApplicationFilterChain 的 filters 中。
Shiro 將 AbstractShiroFilter 的一個實現 org.apache.shiro.spring.web.ShiroFilterFactoryBean.SpringShiroFilter
新增到 filters 中,並命名為 "shiroFilter"。 該類的繼承關係如下:
注:org.apache.shiro.web.servlet.OncePerRequestFilter 與 Spring 中的 OncePerRequestFilter 同名,但實現不同。
將 shiroFilter 新增到 filters 中的邏輯在 org.apache.shiro.spring.config.web.autoconfigure.ShiroWebFilterConfiguration
中:
@Bean(name = REGISTRATION_BEAN_NAME) @ConditionalOnMissingBean(name = REGISTRATION_BEAN_NAME) protected FilterRegistrationBean<AbstractShiroFilter> filterShiroFilterRegistrationBean() throws Exception { FilterRegistrationBean<AbstractShiroFilter> filterRegistrationBean = new FilterRegistrationBean<>(); filterRegistrationBean.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.INCLUDE, DispatcherType.ERROR); filterRegistrationBean.setFilter((AbstractShiroFilter) shiroFilterFactoryBean().getObject()); // SpringShiroFilter 範例 filterRegistrationBean.setName(FILTER_NAME); // "shiroFilter" filterRegistrationBean.setOrder(1); return filterRegistrationBean; } 複製程式碼
使用 DEBUG 方式 Shiro Web 應用,也可以佐證上述觀點:
Shiro 在 OncePerRequestFilter 中實現了 Filter#doFilter 方法,並在該方法中將過濾器的處理邏輯交由其定義的模板方法 doFilterInternal 來實現。 AbstractShiroFilter 提供了對 doFilterInternal 的基本實現:
將 HttpServletRequest 包裝成 ShiroHttpServletRequest
將 HttpServletResponse 包裝成 ShiroHttpServletResponse
executeChain(request, response, origChain);
,其中 origChain 是 Tomcat 處理請求響應的 ApplicationFilterChain,即 shiroFilter 所在的 chain。
chain = PathMatchingFilterChainResolver#getChain(request, response, origChain);
chain 是前面提到的 ProxiedFilterChain 範例。
chain.doFilter(request, response);
,相當於將請求交給 shiro-filter 組成的 chain 處理,大體流程與 ApplicationFilterChain 類似。
當請求經過 ApplicationFilterChain 處理,進入到 shiroFilter 時,它的 doFilter 方法(在 OncePerRequestFilter 中)將請求交給 doFilterInternal 方法(在 AbstractShiroFilter 中)處理。 然後會執行與請求路徑相關聯的 shiro-filter 組成的 chain 對請求、響應進行處理。 下圖是 shiro-chain 與 application chain 之間的關係,可以參考下幫助加深理解。
今天介紹了 Tomcat 中 Filter 責任鏈的作用原理以及 Shiro 中實現的安全相關的 Filter 責任鏈。 並且,還分析了 Shiro 是如何作為一個 Filter 應用到 Web 應用的。 綜上,我們瞭解了一個請求是如何經過層層 Filter 到達 Servlet 中的,也瞭解了 Shiro 是如何在這個流程中發揮安全認證作用的。 希望以上的內容能對你有所幫助。
以上就是Spring Boot Shiro在Web應用中的作用詳解的詳細內容,更多關於Spring Boot Shiro Web的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45