這是本文件的舊版!
REST Auth使用OAuth2所發生的衝突
Problem
我們的Web App提供了Web Console與Rest API兩種介面。最近發現透過瀏覽器登入Web Console後,再去做Rest API的登入認證,會造成Web Console登出的問題。
How to resolve?
經過Trace發現是由於在before PRE_AUTH_FILTER階段,會經過OAuth2的Resource Server Filter:
<http name="api" pattern="/api/**" create-session="never" > <intercept-url pattern="/api/**" access="ROLE_ADMIN" /> <http-basic entry-point-ref="digestEntryPoint"/> <custom-filter ref="digestFilter" after="BASIC_AUTH_FILTER" /> <custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" /> </http>從OAuth2AuthenticationProcessingFilter程式碼可以得知,如果在同一個session中已經過認證,則此Filter會清空SecurityContext:
而OAuth2AuthenticationProcessingFilter又提供了stateless設置,讓你可以在發生此問題時,不去清掉它。而在spring-security-oauth2 2.0.8版本後,設定檔是支援此屬性設置的:
<oauth2:resource-server id="resourceServerFilter" stateless="false" token-services-ref="tokenServices" entry-point ref="oauthAuthenticationEntryPoint"/>如此一來,當經過此Filter時,就會自動略過往下一個Filter去了。
Reference