Spring-Sicherheit: Wie füge ich der Anmelde-URL einen Umleitungs-Abfrageparameter hinzu, um Lesezeichen für die Seite zu setzen?

Problemszenario

Ich arbeite derzeit an der Anmeldeseite meiner Anwendung, die auf Spring Boot und verwandten Spring-Projekten (wie Sicherheit und Cloud) basiert. Ich erwarte von den Benutzern meiner Anwendung, dass sie die Anmeldeseite mit einem Lesezeichen versehen, und muss daher entsprechend vorgehen. Als ich über mögliche Probleme nachdachte, stellte ich fest, dass die Anwendung nicht wissen kann, wohin sie weiterleiten soll (da dies mehrere URLs sein können), nachdem Sie die Seite mit einem Lesezeichen versehen haben (da es nur / login und keine Weiterleitung gibt). Normalerweise würde der Benutzer beispielsweise nicht zu / dashboard wechseln und wird zur Anmeldung umgeleitet, da keine Authentifizierung vorhanden ist. Nachdem der Benutzer seine Anmeldeinformationen vorgelegt hat, leitet die Anwendung den Benutzer weiter. Dies ist jedoch nur möglich, weil die Anwendung in ihrer aktuellen Sitzung eine SavedRequest-Anforderung enthält, die den Umleitungsspeicherort angibt.

Was ich erreichen will

rundsätzlich möchte ich erreichen, dass die Anwendung weiß, wohin sie gehen soll, nachdem der Benutzer ein Lesezeichen für die URL / login gesetzt hat. Die ideale Situation wäre hier, wenn die / login-URL einen Umleitungsparameter enthält. Beispielsweise

User Visits / Dashboard? Param = Wert Keine Authentifizierung vorhanden, Anwendung leitet zu / login? Redirect = / dashboard? Param = value @ Benutzer meldet sich bei @ Application sendet Benutzer an /dashboard?param=value

Wenn der Benutzer die in Schritt 2 bereitgestellte URL mit einem Lesezeichen versehen würde, würde er der Anwendung nach einem Klick auf das Lesezeichen nach einiger Zeit genügend Informationen zur Verfügung stellen, um eine sinnvolle Weiterleitung durchzuführen.

Wenn jemand eine bessere Herangehensweise kennt, würde ich es gerne hören.

isher genommene Schrit

Bis jetzt habe ich meine Suche nach einer Lösung auf eine andere Antwort auf StackOverflow. Es scheint ein Schritt in die richtige Richtung zu sein, aber einige der gewünschten Funktionen fehlen noch.

Ich habe zunächst eine benutzerdefinierte Implementierung der LoginUrlAuthenticationEntryPoint-Klasse erstellt. Es überschreibt die Methode begince, die folgendermaßen aussieht:

public class CustomLoginUrlAuthenticaitonEntryPoint extends LoginUrlAuthenticationEntryPoint 
{
  @Override
  public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException 
  {
    if (!request.getRequestURI().equals(this.getLoginFormUrl())) 
    {
      RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
      redirectStrategy.sendRedirect(request, response, getLoginFormUrl() + "?redirect=" + request.getRequestURI() + "?" + request.getQueryString());
    }
  }
}

Dann habe ich diese benutzerdefinierte Klasse zur HttpSecurity als Standardauthentifizierungseintrittspunkt hinzugefügt.

@Configuration
@Order(-20)
public class SecurityConfig extends WebSecurityConfigurerAdapter 
{
  @Override
  protected void configure(HttpSecurity http) throws Exception 
  {
    http
      .formLogin()
        .loginPage("/login")
        .permitAll()
      .and()
        .exceptionHandling()
        .authenticationEntryPoint(new CustomLoginUrlAuthenticationEntryPoint("/login"));
  }
}

Und zuletzt habe ich einen benutzerdefinierten Anmeldecontroller implementiert, um die Anmeldeseite zu bedienen.

@Controller
public class LoginController 
{
  @RequestMapping(value = "/login", method = RequestMethod.GET)
  public ModelAndView login(@RequestParam(value = "redirect", required = false) String redirect) 
  {
    ModelAndView model = new ModelAndView();
    // Do something with the redirect url;
    model.setViewName("login");
    return model;
  }

Aber als ich das implementiert habe, schien es, dass die Weiterleitung korrekt funktionierte. (/ dashboard? param = value wurde umgeleitet zu / login? redirect = / dashboard? param = value), aber die Anmeldeseite wurde nicht angezeigt. Beim direkten Besuch der / login-URL wird jedoch die Anmeldeseite angezeigt.

So denke ich, dass ich an der richtigen Stelle bin, um der / login-URL einen benutzerdefinierten Abfrageparameter hinzuzufügen, aber die Implementierung ist, denke ich, nicht ganz vollständig. Kann mir jemand helfen, Dinge herauszufinden, oder vielleicht eine bessere Lösung für mein Problem liefern?

Danke im Voraus

Antworten auf die Frage(4)

Ihre Antwort auf die Frage