Micronaut 4.10无重定向会话认证返回空响应排查
问题回顾
使用Micronaut 4.10,引入micronaut-security和micronaut-security-session组件,目标实现/login端点返回含会话令牌的JSON响应(或至少带Set-Cookie头)。设置micronaut.security.redirect.enabled=false后,HttpRequestExecutorAuthenticationProvider执行成功并返回AuthenticationResponse.success(...),但得到的是无会话Cookie的空响应:
< HTTP/1.1 200 OK < date: Wed, 3 Dec 2025 02:21:47 GMT < content-length: 0
当前application.properties配置:
micronaut.application.name=my-api micronaut.server.context-path=/my-api micronaut.security.authentication=session micronaut.security.redirect.enabled=false
解决步骤
启用会话Cookie核心配置
禁用重定向后,Micronaut不会自动触发会话Cookie的设置逻辑,需显式开启并配置会话Cookie:# 启用会话Cookie micronaut.session.http.cookie.enabled=true # 配置Cookie路径与项目context-path一致 micronaut.session.http.cookie.path=/my-api # 可选:自定义会话Cookie名称(默认是SESSION) micronaut.session.http.cookie.name=MY_API_SESSION # 可选:配置安全属性,生产环境建议开启Secure micronaut.session.http.cookie.http-only=true micronaut.session.http.cookie.secure=${micronaut.server.ssl.enabled:false} # 可选:设置会话超时时间 micronaut.session.max-age=3600s自定义认证成功响应(可选,返回JSON格式会话信息)
若需要返回包含会话ID的JSON响应,实现AuthenticationSuccessHandler替换默认处理器:import io.micronaut.http.HttpResponse; import io.micronaut.http.MutableHttpResponse; import io.micronaut.security.authentication.Authentication; import io.micronaut.security.handlers.AuthenticationSuccessHandler; import jakarta.inject.Singleton; import java.util.Map; @Singleton public class JsonAuthenticationSuccessHandler implements AuthenticationSuccessHandler { @Override public MutableHttpResponse<?> handle(Authentication authentication) { String sessionId = authentication.getAttributes().getOrDefault("sessionId", "unknown").toString(); Map<String, Object> response = Map.of( "sessionId", sessionId, "username", authentication.getName(), "roles", authentication.getRoles() ); return HttpResponse.ok(response); } }验证会话创建逻辑
确认AuthenticationProvider返回的AuthenticationResponse.success(...)中包含必要的用户信息,Micronaut会在认证成功后自动创建会话,并将会话ID通过Cookie返回给客户端。
原理说明
当micronaut.security.redirect.enabled=false时,默认的RedirectAuthenticationSuccessHandler不会执行重定向操作,但也不会主动触发会话的持久化和Cookie设置。通过开启micronaut.session.http.cookie.enabled=true,Micronaut的会话管理器会在认证成功后自动创建会话,并将会话ID写入响应Cookie中。
内容的提问来源于stack exchange,提问作者PatrickB

