標籤:tom 成功 單元測試 imp 那是 關係 .sh ini檔案 default
項目由於是多模組的,所以,測試的時候我想現將shiro架構進行本地測試,然後再放入架構裡面,但是這個困擾我了兩天了都,其實我應該想到的,只是想多試試,最後還不如多想想
先說一下系統的基本情況,項目是多模組協同開發的,我負責的使用者管理模組和許可權認證模組,許可權認證使用的是shiro架構,然後我就在網上學習了這個架構以及這個架構和ssm的整合,問題就出現在這裡:學習的是和ssm架構進行整合,而這個整合用到了web的內容,而我只是本地化單元測試,所以我在寫test cases的時候就出現了很多異常,讓我百思不得其解,我先用shiro.ini檔案讀取本地檔案獲得的結果是正確的,然後我整合進spring容器的時候,相同的方法,總是拋出異常
java.lang.IllegalArgumentException: SessionContext must be an HTTP compatible implementation.
然後開始網上找這類異常,梳理了一下,基本都是shirofilter順序之類的,但是這個不符合我的要求啊,我要的是本地測試啊,並且,本地測試和這個sessionContext有毛關係啊?難不成是這個shiro的securityManager還需要web?前天這個念頭在我頭腦中一閃而過,然後我就否定了,因為是按照教程上來的啊。。。就是這個否定,讓我白忙活了兩天來解決這個問題。。。
今天,我梳理了一下認證流程,然後再找問題,然後就又想起先前的念頭,真的是兩個SecurityManager是不一樣的嗎?好吧,那我就打個log看看,一看,確實不一樣,讀取ini檔案產生SecurityManage Factory,然後產生SecurityManage,類型是:
org.apache.shiro.mgt.DefaultSecurityManager
但是呢,我託管給spring容器的類型是
org.apache.shiro.web.mgt.DefaultWebSecurityManager
很明顯,兩個不是一個類型。那是不是這個引起的sessionContext呢?那就試一試,果然是這個影響的。。。。
呵呵,這樣就給我提了一個醒,以後讀取本地設定檔沒問題的,注入spring容器有問題的,一定要注意這兩個類型是不是一致。
首先先看看類的繼承結構
下面是認證流程
1.先由使用者名稱和密碼產生一個UsernamePasswordToken
2,由Subject主體通過Login提交token,然後交給DelegatingSubject交給securityManager來執行login這個操作
3,securityManager有自己的realm,就是在設定檔制定的那個customerealm,所以,這個時候就有securityManager將這個操作交給customerealm來執行
4,一切都認證通過後,會產生一個subject,如果沒有認證成功,值直接拋出異常,我們根據異常來判斷是異常類別,一般都設定為使用者名稱或者密碼錯誤
比較詳細的認證流程
java.lang.IllegalArgumentException: SessionContext must be an HTTP compatible implementation.:模組化本地測試shiro的一些總結