2013-04-06 17 views
12

Ich habe Spring MVC + Spring Security-Projekt.Verhindern Redirect Login für Spring Security

<http auto-config="true" access-denied-page="/security/accessDenied" use-expressions="true" disable-url-rewriting="true"> 

... 
<intercept-url pattern="/dashboard/myaccount/**" access="hasAnyRole('ROLE_PERSON', 'ROLE_DEALER')"/> 
... 

<form-login login-page="/security/login" authentication-failure-url="/security/login?error=true" 
       default-target-url="/security/success" username-parameter="email" 
       password-parameter="secret"/> 
<logout invalidate-session="true" logout-success-url="/index" logout-url="/security/logout"/> 

Wenn ein Benutzer zur Login-Seite geht, wird, wenn erfolgreich "/ security/success" weitergeleitet, wo ich mehr Material in der Steuerung mit dem Session-Objekt zu tun (record userID, ... etc)

Mein Problem ist, wenn ein GUEST-Benutzer nach/Dashboard/MyAccount (die AUTH erfordert) geht, wird er auf die Anmeldeseite umgeleitet (die ich nicht will, ich bevorzuge eine 404 geworfen). Danach wird Spring Security nicht auf/security/success umgeleitet. Stattdessen wird nach/dashboard/myaccount umgeleitet.

Ich würde es vorziehen, eine Möglichkeit zu finden, diese Umleitung auf die Anmeldeseite vollständig zu deaktivieren, falls der GUEST versucht, auf eine AUTH-Seite zuzugreifen.

Ist eine Möglichkeit, dies zu tun?

Tnx

Antwort

5

Gefunden dies: immer-use-default-target = "true"

ich diese Weise wird meine Controller-Funktion nach jedem Login immer aufgerufen.

11

Wir fügen eine neue authenticationEntryPoint:

<http auto-config="true" access-denied-page="/security/accessDenied" use-expressions="true" 
     disable-url-rewriting="true" entry-point-ref="authenticationEntryPoint"/> 

<beans:bean id="authenticationEntryPoint" class="a.b.c..AuthenticationEntryPoint"> 
    <beans:constructor-arg name="loginUrl" value="/security/login"/> 
</beans:bean> 

public class AuthenticationEntryPoint extends LoginUrlAuthenticationEntryPoint {  
    public AuthenticationEntryPoint(String loginUrl) { 
     super(loginUrl); 
    } 

    @Override 
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { 
     response.sendError(403, "Forbidden"); 
    } 
} 
+1

Ihre eigene AuthenticationEntryPoint, Gebrauch erstellen Keine Notwendigkeit: org. springframework.security.web.authentication.Http403ForbiddenEntryPoint – unify

+0

@unify Ich bin froh, dass ich auf Ihren Kommentar so viel sauberer schaute – ndrone

+0

Würden Sie pl Leichtigkeit, werfen Sie einen Blick auf meine Frage zu https://stackoverflow.com/q/47849246/2556354 – madz

2

In kommentierten Konfiguration in SpringSecurity 4 Sie tun können:

public class SecurityConfig extends WebSecurityConfigurerAdapter { 

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    // .... 
    http.exceptionHandling().authenticationEntryPoint(new AuthenticationEntryPoint() { 

     @Override 
     public void commence(HttpServletRequest request, HttpServletResponse response, 
       AuthenticationException authException) throws IOException, ServletException { 
      if (authException != null) { 
       response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 
       response.getWriter().print("Unauthorizated...."); 
      } 
     } 
    }); 
    // .... 
} 

}

+0

Ich fand diesen Rat, mir in einer anderen Situation zu helfen. Vielen Dank – madz

Verwandte Themen