這是本文件的舊版!


REST Auth使用OAuth2所發生的衝突

我們的Web App提供了Web Console與Rest API兩種介面。最近發現透過瀏覽器登入Web Console後,再去做Rest API的登入認證,會造成Web Console登出的問題。

經過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去了。