2016-11-23 3 views
0

Die Webanwendung, an der ich arbeite, verwendet Spring Security. Ich habe es so konfiguriert, dass nicht autorisierte Anfragen von einem der Controller bearbeitet werden (unter Verwendung von access-denied-handler). Wenn jedoch jemand versucht, auf eine Seite zuzugreifen, bevor er sich anmeldet, findet er sich auf der Login-Seite wieder, ohne den Controller zu durchlaufen. Ich möchte, dass dieser Fall von demselben Controller behandelt wird, wie oben erwähnt.Wie kann verhindert werden, dass nicht authentifizierte Benutzer zur Anmeldeseite in Spring Security umgeleitet werden?

Es gibt eine similar question, in der REST-API-Anforderungen von einem Controller verarbeitet werden und die verbleibenden Anforderungen zur Anmeldeseite umgeleitet werden. Dies wurde mit zwei Einstiegspunkten erreicht. Was ich will ist, dass ein Cotroller alle nicht autorisierten/nicht authentifizierten Anfragen bearbeitet, seien es Serviceanrufe oder statische Seiten. Also brauche ich nicht zwei verschiedene Mechanismen. Muss ich noch einen Einstiegspunkt konfigurieren? Ich nehme an, es sollte einen einfacheren Weg geben, dies zu tun. Hier

ist, was meine Sicherheitskonfiguration in etwa wie folgt aussieht:

<http use-expressions="true" pattern="/**" authentication-manager-ref="operatorAuthenticationManager"> 
    <access-denied-handler error-page="/denied" /> 

    <intercept-url pattern="/order/**" access="hasAnyAuthority('ROLE_ADMIN','ROLE_OPERATOR')"/> 
    <intercept-url pattern="/client/**" access="hasAnyAuthority('ROLE_ADMIN')"/> 
    <intercept-url pattern="/denied" access="permitAll"/> 
    <intercept-url pattern="/login" access="permitAll"/> 
    <intercept-url pattern="/login.jsp" access="permitAll"/> 
    ... 
    <intercept-url pattern="/**" access="hasAnyAuthority('ROLE_ADMIN','ROLE_OPERATOR')"/> 

    <form-login login-page="/login" default-target-url="/" always-use-default-target="true" 
       authentication-success-handler-ref="operatorAuthenticationSuccessHandler" authentication-failure-url="/login?error"/> 
    <logout logout-success-url="/login"/> 
</http> 

Antwort

1

Ein Einstiegspunkt ist:

wo der Authentifizierungsprozess durch einen Versuch durch einen nicht authentifizierten Benutzer ausgelöst wird, auf eine gesicherte Ressource zuzugreifen

Mit diesem Argument passt eine Einstiegspunkt Bean perfekt zu Ihren Anforderungen.

In Ihrem Einstiegspunkt können Sie eine Umleitung zu Ihrer Fehlerseite definieren.

@Component 
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint{ 

    @Override 
    public void commence(HttpServletRequest request, HttpServletResponse response, 
    AuthenticationException authException) throws IOException{ 
     //your implementation 
    } 
} 

Das obige Beispiel zeigt, dass Sie, um herauszufinden, müssen wie mit HttpServletReponse leite, hier ist ein Link, der zeigt, wie es geht:

HttpServletResponse sendRedirect permanent

Verwandte Themen