提问者:小点点

QuarkusHTTP身份验证注销


我目前正在开发一个超文本传输协议表单认证的应用程序。阅读“基于表单的认证”页面(https://quarkus.io/guides/security-built-in-authentication)后,我面临注销阶段的问题。留档没有提到注销当前会话的任何选项。

由于Quarkus内部使用Vert. x,我尝试了以下方法:

@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) {
        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);
    }
}

这不像预期的那样工作。log.info日志记录良好([AuthController](执行器-thread-0)c1=MyCookieName, c2=Quarkus-重定向-位置)并且重定向工作正常。但是会话仍然存在。

我怎样才能修好它?

谢谢你的帮助,


共2个答案

匿名用户

经过多次研究和尝试,我发现的一个解决方案是使用Javascript使cookie无效:

document.cookie = "MyCookieName=; Max-Age=0";

这会使cookie无效并重定向到登录页面。

匿名用户

郑重声明,这样的东西似乎可以工作(使用resteasy-reactive):

import io.vertx.core.http.HttpServerResponse;
import org.jboss.resteasy.reactive.RestResponse;

@Path("/logout")
public class UserLogout {

   @ConfigProperty(name = "quarkus.http.auth.form.cookie-name")
   String cookieName;

   @Inject
   UriInfo uriInfo;

   @POST
   public RestResponse<Object> logout(HttpServerResponse response) {
      URI loginUri = uriInfo.getRequestUriBuilder().replacePath("/login").build();
      // Note that we set invalidate=true to expire the cookie
      response.removeCookie(cookieName, true);
      return RestResponse.seeOther(loginUri);
   }

}

PS.io. vertx.ext.web.RoutingContext.RemoveCookie(String,boolean)已弃用,resteasi-reactive中不需要@Context