2017-03-03 5 views
0

Ich habe eine Anwendung, wo ich die setDefaultTargetUrl('...') in der SuccessfulLoginHandler haben.Spring - Die beste Methode, um mehrere URLs zu setzen - setDefaultTarget

Jetzt muss ich einen Fall implementieren, in dem der Benutzer sich einloggen und eine andere Ansicht sehen kann. So weit was ich getan habe ist:

@Service 
public class SuccessfulLoginHandler extends SimpleUrlAuthenticationSuccessHandler{ 

    UserService userService; 

    @Autowired 
    public SuccessfulLoginHandler(UserService userService){ 
     this.userService = userService; 
     setDefaultTargetUrl("/app"); 
    } 

    @Override 
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, 
     Authentication authentication) throws IOException, ServletException { 
     User user = AccessService.getUser(authentication); 
     if(this.userService.isFirstLogin(user)){ 
      setDefaultTargetUrl("/firstlogin"); 
     }else{ 
      setDefaultTargetUrl("/app"); 
     } 
     super.onAuthenticationSuccess(request, response, authentication); 
    } 

} 

Ich bin mir nicht sicher, ob dies der beste Weg ist. Es funktioniert ordnungsgemäß, könnte aber ein Problem sein, wenn sich 2 Benutzer gleichzeitig anmelden.

Was wäre der richtige Weg, um die "Weiterleitung" zu implementieren.

+1

Lösung sieht gut aus für mich. auch - es sollte kein Problem geben, wenn sich 2 Benutzer gleichzeitig anmelden (die einzige geteilte Ressource ist der Benutzerservice und sollte threadsafe sein) – fateddy

+0

Ich denke du hast Recht, aber ich habe die Logik auf meinen Controller verschoben, nur um sicher zu sein und dort Ich mache die Weiterleitung. – gon250

Antwort

-1

Nach erfolgreicher Anmeldung können Sie versuchen, Benutzer auf eine Standard-URL umzuleiten.

Wenn Sie Spring Security verwenden, können Sie einfach eine URL für den Erfolg oder eine Fehler-URL festlegen.

http 
    .authorizeRequests() 
     .anyRequest().authenticated() 
     .and() 
    .formLogin() 
     .loginPage("/login") 
     .failureUrl("/login?login_error=t") 
     .defaultSuccessUrl("/app") 
     .permitAll() 

Wenn Sie einige benutzerdefinierte Logik nach einer erfolgreichen Anmeldung festlegen möchten, können Sie etwas tun können,

public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { 

    String queryString = request.getQueryString(); 
    if(queryString == null) { 
     response.setStatus(200); 
    } else if(!queryString.contains("redirectUrl=")) { 
     response.sendRedirect("/"); 
    } else { 
     queryString = URLDecoder.decode(queryString.replace("url=", ""), "utf-8");    
     response.sendRedirect(queryString);    
    } 
} 

P. S. Wenn Sie bei der Umleitung die serverseitige Umleitung bevorzugen, können Sie request.getRequestDispathcer anstelle von response.sendRedirect verwenden.

BEARBEITEN: gleichzeitige Anmeldung sollte keine Probleme verursachen, da der userService ein schreibgeschützter Dienst ist und keine Race Condition Probleme aufwerfen sollte.

Verwandte Themen