2012-08-14 1 views
9

Ich habe Spring-Sicherheit konfiguriert mit grundlegenden und formularbasierten Authentifizierung gemäß auto-config='true'.Wie kann ich die auf Springform basierende Anmeldung für REST-konforme Endpunkte deaktivieren?

Ich möchte die Endpunkte unter /api/** KEINE formularbasierte Sicherheit verwenden. Andere Endpunkte außerhalb von /api/** sollten die formularbasierte Anmeldung verwenden. Ich möchte eine 401 Antwort an jeden Anruf für diese Endpunkte gesendet, die keine Anmeldeinformationen unter /api/** bieten.

UPDATE: Dank Luke Taylors Kommentar unten habe ich die folgende Lösung gefunden.

HINWEIS: Diese Technik kann nur ab der Federsicherung 3.1 angewendet werden.

Zuerst erhalte ich /api/**. Wir erstellen nie eine Sitzung, obwohl eine verwendet wird, falls verfügbar, dies wird von create-session="never" und die Verwendung von <session-management/> behandelt.

<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

Schauen Sie hier http://www.baeldung.com/2011/10/31/securing-a-restful-web-service-with-spring-security-3-1-part-3/. In diesem Tutorial finden Sie einige Antworten auf Ihre Fragen. – dimas

+1

Siehe meine Antwort auf [diese Frage] (http://stackoverflow.com/questions/9302795/handling-both-form-and-http-basic-authentication-with-different-sources), die im Wesentlichen das Gleiche fordert. –

+0

Hallo Luke, in der Theorie sieht das wie ich aus und werde untersuchen, wie ich es anwende. Mit mehreren '' Tags könnten sie versehentlich beide die Anfrage bearbeiten? Vielleicht kann ich mit SPEL etwas anderes als '/ api' finden. Ich war mir nicht bewusst, dass in Frühling-Sicherheit 3.1 jetzt erlauben sie mehrere "" Tags, das ist eine gute Sache. –

Antwort

19

Mit Spring Security 3.1, die beste Wahl ist, die erholsame und nicht-erholsamen Teile Ihrer Anwendung in separate Filterketten zu spalten durch die Verwendung von zwei separaten <http> Elemente. Die restliche API-Kette kann dann so konfiguriert werden, dass sie zustandslos ist und eine Standardauthentifizierung verwendet, während die Standardkette eine normale Formular-Login-Konfiguration verwenden kann.

Sie hätte dann so etwas wie:

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

Die Kettendefinitionen müssen von den meisten spezifischen Muster zu allgemeinste bestellt werden, so dass die Standardkette kommt zuletzt.

+0

Excellent Luke, vielen Dank für die Antwort. Ich hätte die Dokumentation für 3.1 lesen sollen, um dies zu entdecken, da es sich um ein kleines, aber leistungsstarkes neues Feature handelt. :) –

+0

Ich denke, das create-session-Attribut muss auf 'create-session =" never "' laut diesem Beitrag gesetzt werden: http://stackoverflow.com/questions/16914985/spring-security-either-http-basic- or-form-login-authentication – lanoxx

+0

@lanoxx nicht, wenn Sie möchten, dass Ihre Anwendung vollständig statuslos ist und keine Sitzung hat. –