问题描述
我正在尝试使用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()));
}