Abmeldung von der Spring Webflux-Anwendung nach Sitzungszeitüberschreitung erzwingen?Java

Java-Forum
Guest
 Abmeldung von der Spring Webflux-Anwendung nach Sitzungszeitüberschreitung erzwingen?

Post by Guest »

Ich habe also eine Spring-Boot-App, die auf zwei Diensten läuft, einer ist ein Gateway mit Spring-Cloud-Gateway, Webflux und Spring-Session und der andere ist ein Ressourcenserver. Sie werden mit OAuth2 SSO authentifiziert. Grundsätzlich besteht mein Problem darin, dass ich versuche, eine erzwungene Benutzerabmeldung in der App einzuführen, die nach einer bestimmten Inaktivität ausgelöst wird. Zuerst habe ich versucht, die Eigenschaft server.servlet.session.timeout=60s in meinen Anwendungseigenschaften zu verwenden, aber das scheint keine Abmeldung auszulösen. Was ich genau möchte, ist, dass der Server, wenn die Sitzung aufgrund von Inaktivität abläuft, zum Endpunkt „/logout“ umleitet und den Benutzer aufgrund von Inaktivität abmeldet.
Also, was ich versucht habe Jetzt muss ein LogoutHandler erstellt werden, der von einem WebFilter ausgelöst wird, wenn die Sitzung abläuft. Das einzige Problem ist, dass ich nicht sicher bin, ob ich die richtige Sitzung vor mir habe. Ich habe diese Methode:

Code: Select all

@Bean
public WebFilter expireSpringSessionFilter () {
return (exchange, chain) -> exchange.getSession
.flatMap( exchangeSession -> {
if (exchangeSession.isExpired()) {
logoutHandler.logout(
new WebFilterExchange(exchange, chain), (Authentication) ReactiveSecurityContextHolder.getContext()
).then(
logoutSuccessHandler.onLogoutSuccess(new WebFilterExchange(exchange, chain), null)
);
return Mono.defer(() ->
{
exchange.getResponse().getStatusCode(HttpStatus.FOUND);
exchange.getResponse().getHeaders().setLocation(URI.create("/logout"));
return exchange.getResponse().setComplete();
}
);
}
return chain.filter(exchange);
});
}
Aber wenn ich es debugge, scheint es, dass das Sitzungsobjekt ein OidcSessionRegistryWebSession-Objekt ist – was richtig zu sein scheint, da sich der Benutzer auf diese Weise authentifiziert, aber das Zeitlimit für die Sitzung im Debugger beträgt 3600 Sitzungen/1 Stunde, was, wie bereits erwähnt, nicht der Wert ist, auf den ich ihn in meinen application.properties eingestellt habe. (Bitte verzeihen Sie mir, dass ich ein Anfänger bin.) Ich kann nicht sagen, ob ich vielleicht einen HttpSessionListener verwenden sollte, um die HttpSession anstelle der Servlet-Sitzung zu überprüfen? Aber mein Repo verwendet javax/jakarta.servlet nicht, also glaube ich nicht, dass das das Problem ist.
Ich schätze, meine Fragen lauten wie folgt:
< ol>
[*]Wie kann ich ermitteln, welches Sitzungsobjekt/welche Sitzungsklasse definiert, ob ein Benutzer vom Backend abgemeldet werden soll oder nicht? AKA, bei welcher Sitzung muss ich das Timeout ändern, um sicherzustellen, dass die Benutzerauthentifizierung ungültig wird?
[*]Wie erzwinge ich, dass sich der Benutzer abmeldet, da ich denke, dass mein Filter möglicherweise etwas kompliziert ist? Doofe Idee – gibt es eine andere Möglichkeit, nach Ablauf der Sitzung eine erzwungene Umleitung zu /logout zu erzwingen?

Ich hoffe, das macht Sinn, bitte lassen Sie es mich wissen wenn Sie eine Klarstellung benötigen. Ich habe auch Teile meiner Codebasis angehängt, die meiner Meinung nach relevant sein könnten:
Sicherheitskonfiguration (der Kürze halber wurden einige Teile entfernt, aber sie sind alle konfiguriert) :

Code: Select all

@Bean
public SecurityWebFilterChain SecurityWebFilterChain (
ServerHttpSecurity http, ReactiveAuthenticationManagerResolver tokenAuthManagerResolver,
ServerAuthenticationConverter authTokenConverter
) {
return http
.csrf()
.authorizeExchange()
.oAuth2Login()
.logout(
logout -> logout
.logoutUrl("/logout")
.logoutHandler(logoutHandler())
.logoutSuccessHandler(logoutSuccessHandler())
)
.oauth2ResourceServer()
.build()
}
Abmelden/LogoutSuccessHandler:

Code: Select all

@Bean
public ServerLogoutHandler logoutHandler() {
return (exchange, authentication) -> {
authentication.setAuthentication(false);
return exchange.getExchange().getSession().flatMap(
webSession ->
webSession.invalidate();
return Mono.empty();
)
}
}

@Bean
public ServerLogoutSuccessHandler logoutSuccessHandler() {
RedirectServerLogoutSuccessHandler logoutSuccessHandler = new RedirectServerLogoutSuccessHandler();
logoutSuccessHandler.setLogoutSuccessUrl(logoutRedirectUrl);
return logoutSuccessHandler;
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post