Quarkus HTTP表单认证场景下会话无法正常登出问题如何解决?
问题原因
- 你仅删除了客户端侧的认证Cookie与重定向Cookie,没有销毁服务端存储的对应会话实例,服务端仍会将该会话判定为有效状态
- 未清除当前请求上下文绑定的安全认证信息,导致后续同会话请求仍能识别到登录状态
修复方案
方案1:修改现有RoutingContext实现
在删除Cookie前先销毁服务端会话即可,修改后的代码如下:
@Path("/auth") public class AuthController { @LoggerName("AuthController") Logger log; @ConfigProperty(name = "quarkus.http.auth.form.cookie-name") String COOKIE_NAME; @ConfigProperty(name = "quarkus.http.auth.form.location-cookie") String REDIRECT_COOKIE_NAME; @ConfigProperty(name = "quarkus.http.auth.form.login-page") String LOGIN_PAGE; @GET @Path("/logout") public void logout(@Context RoutingContext ctx) { // 新增:销毁服务端会话,这是登出的核心逻辑 if (ctx.session() != null) { ctx.session().destroy(); } // 保留原有删除Cookie的逻辑,双重保证客户端无残留认证信息 var c1 = ctx.removeCookie(COOKIE_NAME); var c2 = ctx.removeCookie(REDIRECT_COOKIE_NAME); log.info(String.format("c1 = %s, c2 = %s", c1.getName(), c2.getName())); ctx.redirect(LOGIN_PAGE); } }
方案2:使用标准Servlet API简化实现
如果你的Quarkus应用引入了web扩展,可直接注入HttpServletRequest调用标准logout方法,不需要手动处理Cookie和会话:
@Path("/auth") public class AuthController { @ConfigProperty(name = "quarkus.http.auth.form.login-page") String LOGIN_PAGE; @GET @Path("/logout") public Response logout(@Context HttpServletRequest request) throws ServletException { // 标准API自动完成会话销毁、Cookie清除、安全上下文清理 request.logout(); request.getSession().invalidate(); return Response.temporaryRedirect(URI.create(LOGIN_PAGE)).build(); } }
内容的提问来源于stack exchange,提问作者Simon LEDUNOIS
相关产品推荐
相关产品推荐

