2013-01-25 109 views
6

我嘗試基於官方教程Sparklr2/Tonr2實現我自己的示例。一切看起來都很好,但是當我在Tonr2落實,春季安全過濾器從web.xml刪除我有例外:彈簧安全oauth 2簡單示例

沒有重定向URI已經建立當前請求

我無法理解我應該使用哪個網址。這裏是我的代碼,爲客戶實現:

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

<!--define an oauth 2 resource for sparklr --> 
<oauth:resource id="provider" type="authorization_code" client-id="client" client-secret="secret" 
    access-token-uri="http://localhost:8080/provider/oauth/token" user-authorization-uri="http://localhost:8080/provider/oauth/authorize" scope="read,write" /> 

<beans:bean id="clientController" class="com.aouth.client.ClientController"> 
    <beans:property name="trustedClientRestTemplate"> 
     <oauth:rest-template resource="provider" /> 
    </beans:property> 
</beans:bean> 

而對於供應商:

<http pattern="/oauth/token" create-session="stateless" authentication-manager-ref="clientAuthenticationManager" xmlns="http://www.springframework.org/schema/security"> 
    <intercept-url pattern="/oauth/token" access="IS_AUTHENTICATED_FULLY" /> 
    <anonymous enabled="false" /> 
    <http-basic /> 
</http> 

<authentication-manager id="clientAuthenticationManager" xmlns="http://www.springframework.org/schema/security"> 
    <authentication-provider user-service-ref="clientDetailsUserService" /> 
</authentication-manager> 

<bean id="clientDetailsUserService" class="org.springframework.security.oauth2.provider.client.ClientDetailsUserDetailsService"> 
    <constructor-arg ref="clientDetails" /> 
</bean> 

<!-- The OAuth2 protected resources are separated out into their own block so we can deal with authorization and error handling 
    separately. This isn't mandatory, but it makes it easier to control the behaviour. --> 
<http pattern="/secured" create-session="never" access-decision-manager-ref="accessDecisionManager" xmlns="http://www.springframework.org/schema/security"> 
    <anonymous enabled="false" /> 
    <intercept-url pattern="/secured" access="ROLE_USER,SCOPE_READ" /> 
    <custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" /> 
    <http-basic /> 
</http> 

<bean id="accessDecisionManager" class="org.springframework.security.access.vote.UnanimousBased" xmlns="http://www.springframework.org/schema/beans"> 
    <constructor-arg> 
     <list> 
      <bean class="org.springframework.security.oauth2.provider.vote.ScopeVoter" /> 
      <bean class="org.springframework.security.access.vote.RoleVoter" /> 
      <bean class="org.springframework.security.access.vote.AuthenticatedVoter" /> 
     </list> 
    </constructor-arg> 
</bean> 

<oauth:resource-server id="resourceServerFilter" resource-id="resource" token-services-ref="tokenServices" /> 

<bean id="tokenServices" class="org.springframework.security.oauth2.provider.token.DefaultTokenServices"> 
    <property name="tokenStore" ref="tokenStore" /> 
    <property name="supportRefreshToken" value="true" /> 
    <property name="clientDetailsService" ref="clientDetails"/> 
</bean> 

<bean id="tokenStore" class="org.springframework.security.oauth2.provider.token.InMemoryTokenStore" /> 

<http auto-config="true" xmlns="http://www.springframework.org/schema/security"> 
    <intercept-url pattern="/test" access="ROLE_USER" /> 
    <intercept-url pattern="/" access="IS_AUTHENTICATED_ANONYMOUSLY" /> 
</http> 

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

<oauth:authorization-server client-details-service-ref="clientDetails" token-services-ref="tokenServices" > 
    <oauth:authorization-code /> 
    <oauth:implicit /> 
    <oauth:refresh-token /> 
    <oauth:client-credentials /> 
    <oauth:password /> 
</oauth:authorization-server> 

<oauth:client-details-service id="clientDetails"> 
    <oauth:client client-id="client" resource-ids="resource" authorized-grant-types="authorization_code, implicit" 
     authorities="ROLE_CLIENT" scope="read,write" secret="secret" /> 
</oauth:client-details-service> 

我只是希望我的客戶不帶彈簧的安全工作。而當我需要我的受保護資源時,我只想在供應商一方登錄。

+0

你能完成它嗎?你有代碼來證明你做了什麼嗎?我正在嘗試學習相同的東西 – daydreamer

回答

10

您在此處粘貼是春天的爲OAuth的提供商 XML和保護資源,而你的情況在同一個Web應用程序運行你第二XML。 (當然,如果你願意,你可以將它們分開)。

客戶端(第一個粘貼XML)是一個不同的故事。如果我正確地理解了你,你希望你的客戶在沒有Spring的幫助下運行(成爲一個普通的web應用程序,而不是spring-security-oauth-client webapp)。

您必須瞭解oAuth的工作方式:客戶端嘗試訪問受保護的資源;如果它沒有訪問令牌,它將被重定向到oAuth提供程序(顯示登錄頁面並提供令牌)。 By the standard,對訪問令牌的請求必須包含一個「redirect-uri」參數,所以在成功登錄後,oAuth提供者知道將客戶端重定向到哪裏。 oAuth客戶端爲你做,如果你從web.xml中刪除「oauth客戶端」,你現在必須自己實現這個。

感謝您的回答。但我仍然不明白彈簧如何影響我的oAuth客戶端。並且我可以用於客戶端 spring-oauth(spring-mvc)沒有彈簧安全性嗎?

當你寫這條線在你的XML:

< oauth:client id="oauth2ClientFilter" /> 

這意味着你使用彈簧安全的OAuth,這是一種專門用於OAuth的包,建立在春天的安全性。如果您深入瞭解,它會在處理oAuth內容的鏈中放置一個特殊的過濾器(OAuth2ClientContextFilter),這些過濾器與客戶端相關。其中之一是發送請求的所有參數(「redirect-uri」就是其中之一)。

如果你決定不使用彈簧安全的OAuth,以及 - 你必須自己實現這個邏輯...

希望幫助!

+0

感謝您的回答。但我仍然不明白彈簧安全如何影響我的oAuth客戶端。並且我可以使用客戶端spring-oauth(spring-mvc)而沒有彈簧安全性嗎? – chaldaean

+2

謝謝OhadR,你的回答的確有助於我理解。 – chaldaean

+0

@chaldaean您可以在糾正錯誤後演示完整的security.xml文件 – PRASANTHMV