2012-06-07 28 views
0

在我使用Apache Shiro進行AuthC和AuthZ的Web應用程序中,我有兩個身份驗證領域:一個用於常規Web界面(稱爲SsoRealm)對於使用API​​令牌的REST API(稱爲RestRealm)。由兩個域進行身份驗證的主體具有不相關的權限(和AuthenticationTokens)。如果沒有預先存在的會話並且API調用通過REST接口到達,則一切正常,並且認證(和授權)通過RestRealm發生。但是,如果以前通過 SsoRealm進行了身份驗證的現有會話未通過RestRealm發生身份驗證嘗試,並且連續授權檢查(使用Subject.isPermitted)由於主題來自錯誤領域而失敗。Shiro:即使現有會話已通過其他領域的身份驗證,強制第二領域身份驗證

相應的認證過濾器被註冊爲(使用四郎吉斯):

addFilterChain("/api/x/*/y", REST_AUTH, NO_SESSION_CREATION); 
addFilterChain("/**", SSO_AUTH); 

有什麼我可以做給力的「正確」的境界重認證?

會定製AuthenticationStrategy幫助(即,是否該AuthenticationStrategy合同允許的策略:「如果RestRealm參與,在RestRealm認證必須成功」的實現)? AFAICS ModularRealmAuthenticator.doMultiRealmAuthentication不會再次被調用,如果有一個現有的認證會話...

回答

1

事實證明,這是一個相當容易解決:只要覆蓋AuthenticatingFilter#isAccessAllowed,以確保'正確'的主體類型爲您的身份驗證領域(默認實現只是使用Subject#isAuthenticated來測試是否有任何委託人被認證 - 無論它是否適合領域)。