2013-01-25 19 views
6

Provo a implementare il mio esempio basato sul tutorial ufficiale Sparklr2/Tonr2. Tutto sembra buono, ma quando rimuovo dalla web.xml nel mio Tonr2 implementazione, filtro di sicurezza primavera ho eccezione:Spring security oauth 2 esempio semplice

Nessun redirect URI è stato stabilito per la richiesta corrente

non riesco a capire quale URL dovrei usare. Ecco il mio codice, per l'implementazione del client:

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

E per il provider:

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

Voglio solo il mio cliente di lavorare senza la sicurezza di primavera. E quando ho bisogno della mia risorsa protetta, voglio accedere solo dal lato provider.

+0

sei riuscito a completarlo? hai il codice per dimostrare cosa hai fatto? Sto cercando di imparare la stessa cosa – daydreamer

risposta

10

È 2 ° XML che si è incollato qui è XML della molla per la OAuth-fornitore e il protetta di risorse, che nel tuo caso eseguito nella stessa webapp. (puoi separarli, ovviamente, se lo desideri).

Il client (il 1 ° XML incollato) è una storia diversa. Se ti capisco correttamente, vuoi che il tuo client funzioni senza l'aiuto di Spring (per essere una webapp regolare, e non per la webapp di spring-security-oauth-client).

Devi capire come funziona oAuth: il client cerca di raggiungere una risorsa protetta; se non ha il token di accesso, viene reindirizzato al provider oAuth (che mostra la pagina di accesso e fornisce il token). By the standard, la richiesta per il token di accesso DEVE contenere un parametro "redirect-uri", quindi dopo un login riuscito, il provider oAuth sa dove reindirizzare il client. Il client oAuth lo fa per te, e se elimini il "client oauth" dal tuo web.xml, ora devi implementarlo da solo.

Grazie per la risposta. Ma ancora non capisco come la sicurezza della primavera influenzi il mio client oAuth. E posso usare per il lato client spring-oauth (molla-mvc) senza molla di sicurezza?

Quando si scrive questa linea nel vostro XML:

< oauth:client id="oauth2ClientFilter" /> 

significa che si utilizza la primavera-sicurezza-OAuth, che è un pacchetto dedicato per OAuth, costruito su primavera-sicurezza. Se si scava, inserisce un filtro speciale (OAuth2ClientContextFilter) nella catena che gestisce le cose oAuth, che sono rilevanti per il cliente. Uno di loro sta inviando la richiesta con tutti i parametri ("redirect-uri" è uno di questi).

Se si decide di non utilizzare la primavera-sicurezza-OAuth, ben - si dovrà implementare questa logica da soli ...

Speranza che aiuta!

+0

Grazie per la tua risposta. Ma ancora non capisco come la sicurezza di primavera influenzi il mio cliente oAuth. E posso usare per il lato client spring-oauth (molla-mvc) senza molla di sicurezza? – chaldaean

+2

Grazie OhadR, la tua risposta mi ha davvero aiutato a capire. – chaldaean

+0

@chaldaean puoi dimostrare il file security.xml completo dopo averlo corretto – PRASANTHMV