2013-01-25 38 views
6

Tôi cố gắng triển khai ví dụ của riêng mình dựa trên hướng dẫn chính thức Sparklr2/Tonr2. Tất cả mọi thứ có vẻ tốt nhưng khi tôi loại bỏ từ web.xml trong Tonr2 thực hiện, bộ lọc bảo mật mùa xuân của tôi, tôi có ngoại lệ:Bảo mật mùa xuân oauth 2 ví dụ đơn giản

Không chuyển hướng URI đã được thành lập để yêu cầu hiện tại

Tôi không thể hiểu tôi nên sử dụng URL nào. Đây là mã của tôi, để thực hiện khách hàng:

<!--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> 

Và đối với nhà cung cấp:

<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> 

Tôi chỉ muốn khách hàng của tôi để làm việc không có bảo đảm mùa xuân. Và khi tôi cần tài nguyên được bảo vệ, tôi chỉ muốn đăng nhập vào phía nhà cung cấp.

+0

bạn có thể hoàn thành nó không? bạn có mã để chứng minh bạn đã làm gì không? Tôi đang cố gắng học cùng một điều – daydreamer

Trả lời

10

Bạn 2nd XML mà bạn dán ở đây là XML của mùa xuân cho oauth-nhà cung cấpbảo vệ tài nguyên, mà trong trường hợp của bạn chạy trong webapp cùng. (bạn có thể tách chúng, tất nhiên, nếu bạn muốn).

Ứng dụng khách (XML được dán thứ nhất) là một câu chuyện khác. Nếu tôi hiểu bạn một cách chính xác, bạn muốn khách hàng của bạn chạy mà không cần sự trợ giúp của Spring (là một ứng dụng web thông thường và không phải là ứng dụng web mùa xuân-bảo mật-oauth-client).

Bạn phải hiểu cách oAuth hoạt động: khách hàng cố gắng truy cập tài nguyên được bảo vệ; nếu nó không có mã thông báo truy cập, nó sẽ được chuyển hướng đến nhà cung cấp oAuth (hiển thị trang đăng nhập và cung cấp mã thông báo). By the standard, yêu cầu mã thông báo truy cập PHẢI chứa thông số "chuyển hướng-uri", vì vậy sau khi đăng nhập thành công, nhà cung cấp oAuth biết nơi chuyển hướng khách hàng đến. Ứng dụng oAuth thực hiện điều đó cho bạn và nếu bạn xóa "khách hàng oauth" khỏi tệp web.xml của mình, bây giờ bạn phải tự mình thực hiện điều này.

Cảm ơn câu trả lời của bạn. Nhưng tôi vẫn không hiểu làm thế nào bảo mật mùa xuân ảnh hưởng đến khách hàng oAuth của tôi. Và tôi có thể sử dụng cho phía khách hàng spring-oauth (spring-mvc) mà không cần bảo đảm mùa xuân không?

Khi bạn viết dòng này trong XML của bạn:

< oauth:client id="oauth2ClientFilter" /> 

nó có nghĩa là bạn sử dụng lò xo an ninh-oauth, đó là một gói phần mềm dành riêng cho oauth, được xây dựng trên suối-an ninh. Nếu bạn đào sâu vào, nó sẽ đặt một bộ lọc đặc biệt (OAuth2ClientContextFilter) trong chuỗi xử lý các công cụ oAuth, có liên quan cho khách hàng. Một trong số họ đang gửi yêu cầu với tất cả các thông số ("redirect-uri" là một trong số đó).

Nếu bạn quyết định không sử dụng lò xo an ninh-oauth, tốt - bạn sẽ phải thực hiện logic này một mình ...

Hy vọng rằng sẽ giúp!

+0

Cảm ơn câu trả lời của bạn. Nhưng tôi vẫn không hiểu làm thế nào an ninh mùa xuân ảnh hưởng đến khách hàng oAuth của tôi. Và tôi có thể sử dụng cho mùa xuân phía khách hàng-oauth (spring-mvc) mà không cần bảo đảm mùa xuân không? – chaldaean

+2

Cảm ơn OhadR, câu trả lời của bạn thực sự đã giúp tôi hiểu. – chaldaean

+0

@chaldaean bạn có thể vui lòng chứng minh tệp security.xml đầy đủ sau khi sửa nó – PRASANTHMV