diff --git a/application/src/main/java/run/halo/app/security/authentication/rememberme/TokenBasedRememberMeServices.java b/application/src/main/java/run/halo/app/security/authentication/rememberme/TokenBasedRememberMeServices.java index 4f1e9c0dac..6de95ecf44 100644 --- a/application/src/main/java/run/halo/app/security/authentication/rememberme/TokenBasedRememberMeServices.java +++ b/application/src/main/java/run/halo/app/security/authentication/rememberme/TokenBasedRememberMeServices.java @@ -203,7 +203,7 @@ private boolean isValidCookieTokensLength(String[] cookieTokens) { public Mono loginFail(ServerWebExchange exchange) { log.debug("Interactive login attempt was unsuccessful."); cancelCookie(exchange); - return Mono.empty(); + return rememberMeRequestCache.saveRememberMe(exchange); } @Override diff --git a/application/src/main/java/run/halo/app/security/authentication/rememberme/WebSessionRememberMeRequestCache.java b/application/src/main/java/run/halo/app/security/authentication/rememberme/WebSessionRememberMeRequestCache.java index 5c6f629a02..0152ad6901 100644 --- a/application/src/main/java/run/halo/app/security/authentication/rememberme/WebSessionRememberMeRequestCache.java +++ b/application/src/main/java/run/halo/app/security/authentication/rememberme/WebSessionRememberMeRequestCache.java @@ -1,7 +1,5 @@ package run.halo.app.security.authentication.rememberme; -import static java.lang.Boolean.parseBoolean; - import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebSession; import reactor.core.publisher.Mono; @@ -23,9 +21,7 @@ public class WebSessionRememberMeRequestCache implements RememberMeRequestCache @Override public Mono saveRememberMe(ServerWebExchange exchange) { return resolveFromQuery(exchange) - .filter(Boolean::booleanValue) .switchIfEmpty(resolveFromForm(exchange)) - .filter(Boolean::booleanValue) .flatMap(rememberMe -> exchange.getSession().doOnNext( session -> session.getAttributes().put(SESSION_ATTRIBUTE_NAME, rememberMe)) ) @@ -35,9 +31,7 @@ public Mono saveRememberMe(ServerWebExchange exchange) { @Override public Mono isRememberMe(ServerWebExchange exchange) { return resolveFromQuery(exchange) - .filter(Boolean::booleanValue) .switchIfEmpty(resolveFromForm(exchange)) - .filter(Boolean::booleanValue) .switchIfEmpty(resolveFromSession(exchange)) .defaultIfEmpty(false); } @@ -50,22 +44,20 @@ public Mono removeRememberMe(ServerWebExchange exchange) { } private Mono resolveFromQuery(ServerWebExchange exchange) { - return Mono.just( - parseBoolean(exchange.getRequest().getQueryParams().getFirst(DEFAULT_PARAMETER)) - ); + return Mono.justOrEmpty(exchange.getRequest().getQueryParams().getFirst(DEFAULT_PARAMETER)) + .map(Boolean::parseBoolean); } private Mono resolveFromForm(ServerWebExchange exchange) { return exchange.getFormData() - .map(form -> parseBoolean(form.getFirst(DEFAULT_PARAMETER))) - .filter(Boolean::booleanValue); + .mapNotNull(form -> form.getFirst(DEFAULT_PARAMETER)) + .map(Boolean::parseBoolean); } private Mono resolveFromSession(ServerWebExchange exchange) { return exchange.getSession() - .map(session -> { - var rememberMeObject = session.getAttribute(SESSION_ATTRIBUTE_NAME); - return rememberMeObject instanceof Boolean rememberMe ? rememberMe : false; - }); + .mapNotNull(session -> session.getAttribute(SESSION_ATTRIBUTE_NAME)) + .filter(Boolean.class::isInstance) + .cast(Boolean.class); } } diff --git a/application/src/main/java/run/halo/app/security/preauth/PreAuthLoginEndpoint.java b/application/src/main/java/run/halo/app/security/preauth/PreAuthLoginEndpoint.java index f506ca0d8a..2bc9122db4 100644 --- a/application/src/main/java/run/halo/app/security/preauth/PreAuthLoginEndpoint.java +++ b/application/src/main/java/run/halo/app/security/preauth/PreAuthLoginEndpoint.java @@ -22,6 +22,8 @@ import run.halo.app.security.AuthProviderService; import run.halo.app.security.HaloServerRequestCache; import run.halo.app.security.authentication.CryptoService; +import run.halo.app.security.authentication.rememberme.RememberMeRequestCache; +import run.halo.app.security.authentication.rememberme.WebSessionRememberMeRequestCache; /** * Pre-auth login endpoints. @@ -40,6 +42,8 @@ class PreAuthLoginEndpoint { private final ServerRequestCache serverRequestCache = new HaloServerRequestCache(); + private final RememberMeRequestCache rememberMeRequestCache = new WebSessionRememberMeRequestCache(); + PreAuthLoginEndpoint(CryptoService cryptoService, GlobalInfoService globalInfoService, AuthProviderService authProviderService) { this.cryptoService = cryptoService; @@ -91,7 +95,8 @@ RouterFunction preAuthLoginEndpoints() { "authProvider", authProvider, "fragmentTemplateName", fragmentTemplateName, "socialAuthProviders", socialAuthProviders, - "formAuthProviders", formAuthProviders + "formAuthProviders", formAuthProviders, + "rememberMe", rememberMeRequestCache.isRememberMe(exchange) // TODO Add more models here )) )); diff --git a/application/src/main/resources/templates/gateway_fragments/login.html b/application/src/main/resources/templates/gateway_fragments/login.html index 78005cfa43..bf7eda62ae 100644 --- a/application/src/main/resources/templates/gateway_fragments/login.html +++ b/application/src/main/resources/templates/gateway_fragments/login.html @@ -30,7 +30,7 @@
- +