Micronaut jwt-cookie身份验证:身份验证失败输入错误密码时,如何保留用户名作为响应?

问题描述

我正在尝试使用Micronaut 2.0构建登录表单(请参见tutorial)。 不幸的是,身份验证失败会从登录表单中清除用户名(和密码)。这使用户更加困难。我正在寻找一种将用户名传递回登录表单的方法,以便用户收到登录失败但不必重新输入用户名的消息。

问题似乎是CookieLoginHandler重定向到可配置的authFailed网址(例如/ login / authFailed),这意味着带有用户名的请求上下文已消失。

我首先想到我可以覆盖覆盖JwtCookieLoginHandler,并将用户名作为(可选)查询参数添加到authFailed url中。但是,由于某些构造函数参数引用了非公共类,因此覆盖此类非常困​​难。

解决方法

不确定用于前端的技术是什么,但是如何将用户名保存在浏览器的本地存储中呢?然后它独立于后端,并且在用户重新打开浏览器时也可用。

如果您真的想用micronaut解决它,请使用以下方法创建自己的控制器:

@Post
public Single<MutableHttpResponse<?>> login(
      @Valid @Body UsernamePasswordCredentials usernamePasswordCredentials,HttpRequest<?> request) {
    Flowable<AuthenticationResponse> authenticationResponseFlowable = Flowable
        .fromPublisher(authenticator.authenticate(request,usernamePasswordCredentials));

    return authenticationResponseFlowable.map(authenticationResponse -> {
      if (authenticationResponse.isAuthenticated()) {
        UserDetails userDetails = authenticationResponse.getUserDetails().get();
        eventPublisher.publishEvent(new LoginSuccessfulEvent(userDetails));
        return loginHandler.loginSuccess(userDetails,request);
      } else {
        eventPublisher.publishEvent(new LoginFailedEvent(authenticationResponse));
        return loginHandler.loginFailed(authenticationResponse,request);
      }
    }).first(HttpResponse.status(HttpStatus.UNAUTHORIZED).body(usernamePasswordCredentials.getUsername()));
  }