2012-11-01 142 views
2

我已經安裝了彈簧安全OAuth2服務器。我想編寫客戶端應用程序來使用這個具有spring安全性的oauth服務器,而不保護任何資源。意思是我只想從客戶端運行oauth2並使用spring security 3.1。我已經編寫了以下配置,但在重定向到oauth2服務器授權頁面之前它要求提供憑據。但是我想在從客戶端請求任何憑據之前將用戶重定向到oauth2服務器授權頁面。我正在使用以下配置彈簧安全oauth2客戶端

<http auto-config='true' xmlns="http://www.springframework.org/schema/security"> 
    <intercept-url pattern="/product/**" access="IS_AUTHENTICATED_ANONYMOUSLY" /> 
    <custom-filter ref="oauth2ClientFilter" after="EXCEPTION_TRANSLATION_FILTER" /> 
</http> 

<authentication-manager xmlns="http://www.springframework.org/schema/security"> 
    <authentication-provider> 
     <user-service> 
      <user name="jimi" password="jimi" authorities="ROLE_USER" /> 
     </user-service> 
    </authentication-provider> 
</authentication-manager> 

<!--apply the oauth client context --> 
<oauth:client id="oauth2ClientFilter" /> 


<oauth:resource id="fooClient" type="authorization_code" 
    client-id="foo" client-secret="secret" access-token-uri="${accessTokenUri}" 
    user-authorization-uri="${userAuthorizationUri}" scope="read" /> 


<bean id="dService" class="com.abc.service.DServiceImpl"> 
    <property name="dURL" value="${dURL}"></property> 
    <property name="dRestTemplate"> 
     <oauth:rest-template resource="fooClient" /> 
    </property> 

</bean> 

所以我只是想/產品網址應訪問oauth2服務器。其餘的URL映射應該沒有這個工作。 而用戶應該是匿名的客戶端(無需顯示在客戶端登錄)。

但是當我運行我的應用程序「http:// localhost/client-sample/product/1」時,它顯示「http:// localhost/client-sample/spring_security_login」。但我想用戶應該重定向到oaut2服務器頁面。

回答

11

Spring安全防止匿名用戶獲取訪問令牌。但是如果你仍然希望在你的應用程序中使用這個功能,那麼你將不得不擴展org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeResourceDetails類並重寫isClientOnly()方法。

import org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeResourceDetails; 

public class ExtendedBaseOAuth2ProtectedResourceDetails extends 
    AuthorizationCodeResourceDetails { 

public boolean isClientOnly() { 
    return true; 
} 
} 

默認情況下,此方法返回false。所以你必須重寫這個方法來返回true。 然後在你的root-context.xml文件中,你必須像這樣定義oaut2資源。

<bean id="fooClient" class="com.abc.service.ExtendedBaseOAuth2ProtectedResourceDetails"> 
    <property name="clientId" value="foo"></property> 
    <property name="clientSecret" value="secret"></property> 
    <property name="accessTokenUri" value="${accessTokenUri}"></property> 
    <property name="userAuthorizationUri" value="${userAuthorizationUri}"></property> 
    <property name="scope" value="#{{'read','write'}}"> </property> 
</bean> 

<bean id="dService" class="com.abc.service.DServiceImpl"> 
    <property name="dURL" value="${dURL}"></property> 
    <property name="dRestTemplate"> 
     <oauth:rest-template resource="fooClient" /> 
    </property> 
</bean> 

在將用戶重定向到oauth2提供者授權頁面之前,這不會詢問客戶端的授權。