2010-11-24 4 views
32

Ich benutze Spring Security 3.0.4. Ich habe eine Reihe von Webdiensten, die von Spring Security geschützt sind. Wenn ich auf sie als nicht authentifizierter Benutzer zugreife, leitet Spring Security zur Anmeldeseite um. Stattdessen möchte ich HTTP 403 Fehler zurückgeben. Wie kann ich das erreichen?Spring Security - brauche 403 Fehler, nicht umleiten

Hier ist meine Sicherheit config:

<http auto-config="false" use-expressions="true" > 

    <intercept-url pattern="/authorization.jsp" access="permitAll"/> 
    <intercept-url pattern="/registration.jsp" access="permitAll"/> 
    <intercept-url pattern="/api/authorization/auth" access="permitAll"/> 
    <intercept-url pattern="/api/authorization/new" access="permitAll"/> 
    <intercept-url pattern="/api/accounts/new" access="permitAll"/> 
    <intercept-url pattern="/app/**" access="permitAll"/> 
    <intercept-url pattern="/extjs/**" access="permitAll"/> 

    <intercept-url pattern="/**" access="hasRole('ROLE_USER')" /> 

    <form-login login-page="/authorization.jsp" 
      default-target-url="/index.jsp" 
      authentication-failure-url="/registration.jsp?login_error=1" 
      always-use-default-target="true" 
      /> 

    <logout logout-success-url="/authorization.jsp" 
      logout-url="/j_spring_security_logout" 
      invalidate-session="true"/>   

</http> 
+0

Haben Sie versucht, die Einstellung "authentication-failure-url" in Ihrem Formular-Login zu entfernen? – Gandalf

+0

Haben Sie eine funktionierende Lösung gefunden? Ich habe gehört, dass der Weg, dies zu erreichen, darin besteht, 'einige Spring-Filter' außer Kraft zu setzen, aber ohne Beispiel, und ich denke, dass es möglich sein sollte, zu konfigurieren, weil z.B. AJAX-Anwendung gerne benutzerdefinierte Anmeldung an JSON-Kanal und JSON-Kanäle für Daten werden voraussichtlich mit 403 auf keine Rechte an Service zu reagieren. –

+0

Related: http://stackoverflow.com/questions/3339431/how-to-handle-expired-session-using-spring-security-and-jquery – usethe4ce

Antwort

-4

Es sollte ein 403-Fehler zurück, wenn Sie es so konfigurieren, mit diesem Tag auf eine andere URL zu gehen:

<sec:access-denied-handler error-page="/urlToGoIfForbidden" /> 
+2

Ja, Asker weiß es sollte, weil er diese Frage gestellt hat. Und er fragte, weil es nicht stimmt. –

+1

Dieses Tag funktioniert nur für AUTHENITCATED Benutzer mit nicht genug PREVILAGES (was steht in den Dokumenten ..) – Mat

8

auf den Feder Foren Artikel Es gibt here beschreibt, wie Sie Ihre App zwischen den beiden Methoden bestimmen können. Bisher verwende ich den folgenden Code, um meine Daten-Controller zu sichern:

<bean id="ep403" class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint"/> 

<sec:http pattern="/data/**" entry-point-ref="ep403" use-expressions="true"> 
    <sec:intercept-url pattern="/**" access="isAuthenticated()"/> 
</sec:http> 

<bean id="epauth" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"> 
    <constructor-arg value="/login.html"/> 
</bean> 

<sec:http pattern="/**" entry-point-ref="epauth" use-expressions="true"> 
    <sec:intercept-url pattern="/**" access="isAuthenticated()"/> 
</sec:http> 

So ist die ganze DelegatingAuthenticationEntryPoint Lösung in dem Artikel I verknüpft ist ein bisschen Schwergewicht, aber ich glaube, es macht den Job ganz gut auch.

+0

Die Lösung in dem Artikel, den Sie gepostet haben, löste dieses Problem für mich. Vielen Dank! –

8

(alte Frage, aber es lohnt sich zu beantworten.)

Grundsätzlich müssen Sie

  • erstellen RequestMatcher zu bestimmen, welche Anforderungen sollte eine 403 (AntPathRequestMatcher kann in Ihrem Fall genügt) erhalten.
  • Konfigurieren Sie HttpSessionRequestCache, um den Matcher zu überprüfen und diese Seiten nicht für die Weiterleitung nach der Anmeldung zu speichern.
  • Verwenden Sie eine DelegatingAuthenticationEntryPoint entweder 403 die Anfrage direkt oder umleiten, um sich entsprechend dem Matcher einzuloggen.

Siehe Beispiel hier:

http://distigme.wordpress.com/2012/11/01/ajax-and-spring-security-form-based-login/

10

Für Sie Java-Konfiguration benötigen

http.exceptionHandling().authenticationEntryPoint(alwaysSendUnauthorized401AuthenticationEntryPoint); 

zu tun Wo alwaysSendUnauthorized401AuthenticationEntryPoint innstance der Klasse ist

public class AlwaysSendUnauthorized401AuthenticationEntryPoint implements AuthenticationEntryPoint { 
    @Override 
    public final void commence(HttpServletRequest request, HttpServletResponse response, 
           AuthenticationException authException) throws IOException { 
     LOGGER.debug("Pre-authenticated entry point called. Rejecting access"); 
     response.sendError(HttpServletResponse.SC_UNAUTHORIZED); 
    } 
} 

Dies deaktiviert das Standardverhalten von Spring (Weiterleitung nicht authentifizierter Anfragen zum Anmeldeformular).

Randbemerkung: für einen solchen Fall HTTP-Code SC_UNAUTHORIZED (401) ist bessere Wahl als SC_FORBIDDEN (403).