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);
});
}
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()
}
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;
}