2012-08-14 10 views
9

Ho configurato la sicurezza di primavera utilizzando l'autenticazione di base e basata su modulo come da auto-config='true'.Come posso disabilitare il login basato su form primaverile per endpoint RESTful?

Desidero che gli endpoint sotto /api/** NON utilizzino la protezione basata su modulo. Altri endpoint esterni a /api/** devono utilizzare l'accesso basato su modulo. Vorrei una risposta 401 inviata a qualsiasi chiamata per questi endpoint che non fornivano credenziali in /api/**.

UPDATE: Grazie al commento di Luke Taylor di seguito ho trovato la seguente soluzione.

NOTA: questa tecnica può essere applicata solo a partire dalla sicurezza 3.1.

Prima di estrarre /api/**. Non creiamo mai una sessione, ma usane una se disponibile, questa è gestita da create-session="never" e dall'uso di <session-management/>.

<http pattern="/api/**" create-session="never" use-expressions="true"> 
    <http-basic /> 
    <session-management /> 
    <intercept-url pattern="/api/**" access="hasRole('API_ACCESS')"/> 
</http> 

<http auto-config="true" use-expressions="true"> 
    <intercept-url pattern="/" access="permitAll"/> 
    <intercept-url pattern="/**" access="isAuthenticated()"/> 
</http> 
+1

Guarda qui http://www.baeldung.com/2011/10/31/securing-a-restful-web-service-with-spring-security-3-1-part-3/. In questo tutorial puoi trovare alcune risposte alle tue domande. – dimas

+1

Vedere la mia risposta a [questa domanda] (http://stackoverflow.com/questions/9302795/handling-both-form-and-http-basic-authentication-with-different-sources) che essenzialmente sta chiedendo la stessa cosa. –

+0

Ciao Luke, in teoria questo sembra quello che sto cercando e indagherà per applicarlo. Nell'avere più tag '' potrebbero accidentalmente gestire la richiesta? Forse posso usare SpEL per far corrispondere qualsiasi cosa diversa da '/ api'. Non ero a conoscenza del fatto che in spring 3.1 security ora consentono più tag '', questa è una buona cosa. –

risposta

19

Con Primavera di sicurezza 3.1, la soluzione migliore è quella di dividere le parti riposanti e non riposanti della vostra applicazione in catene di filtri separati utilizzando due distinte <http> elementi. La catena di API restful può quindi essere configurata come stateless e utilizzare l'autenticazione di base, mentre la catena di default può utilizzare una normale configurazione di login form.

Si potrebbe quindi avere qualcosa di simile:

<http pattern="/api/**" create-session="stateless"> 
    <intercept-url pattern="/api/**" access="ROLE_API_USER" /> 
    <http-basic />   
</http> 

<!-- No pattern attribute, so defaults to matching any request --> 
<http> 
    <intercept-url pattern="/**" access="ROLE_USER" /> 
    <form-login />   
</http> 

Le definizioni catena devono essere ordinati dal modello più specifiche per più generale, per cui la catena di default viene scorso.

+0

Eccellente Luca, la ringrazio molto per aver postato la risposta. Avrei dovuto leggere i documenti per 3.1 per scoprirlo in quanto è una piccola ma potente nuova funzionalità. :) –

+0

Penso che l'attributo create-session deve essere impostato su 'create-session =" never "come in questo post: http://stackoverflow.com/questions/16914985/spring-security-either-http-basic- o-form-login-authentication – lanoxx

+0

@lanoxx non se vuoi che la tua applicazione sia completamente stateless e non abbia mai una sessione. –

Problemi correlati