容器发起认证(Container Initiated Authentication)成功后无法重定向至目标资源
登录成功后无法重定向到原始受保护资源的解决方案
你遇到的问题核心是:容器发起认证流程中,登录成功后未自动跳转到用户最初请求的/user/user_index.xhtml,因为你的登录控制器在SUCCESS分支仅打印日志,未处理重定向逻辑——容器不会自动完成这一步,需手动获取原始目标URL并执行重定向。
解决方案
当容器将用户重定向到登录页时,会把原始受保护资源的URL存储在请求属性javax.security.enterprise.authentication.mechanism.http.LoginToContinue.REDIRECT_TO_AFTER_LOGIN中。你需要在认证成功后读取该属性值,执行重定向操作。
方案1:在SUCCESS分支手动处理重定向
修改LoginController的execute方法,添加重定向逻辑:
public void execute() { switch (processAuthentication()) { case SEND_CONTINUE: facesContext.responseComplete(); break; case SEND_FAILURE: // 可添加认证失败提示逻辑 break; case SUCCESS: logger.info("[execute: SUCCESS]"); handleRedirect(); break; } } private void handleRedirect() { ExternalContext ec = facesContext.getExternalContext(); HttpServletRequest request = (HttpServletRequest) ec.getRequest(); // 获取容器存储的原始目标URL String redirectUrl = (String) request.getAttribute( "javax.security.enterprise.authentication.mechanism.http.LoginToContinue.REDIRECT_TO_AFTER_LOGIN" ); try { if (redirectUrl != null && !redirectUrl.isEmpty()) { ec.redirect(redirectUrl); } else { // 无原始URL时跳转到默认页面 ec.redirect("/default.xhtml"); } } catch (IOException e) { logger.error("重定向失败", e); } facesContext.responseComplete(); }
方案2:通过AuthenticationParameters指定重定向目标
修改processAuthentication方法,在认证参数中直接指定重定向URL,让容器自动处理:
public AuthenticationStatus processAuthentication() { ExternalContext ec = facesContext.getExternalContext(); HttpServletRequest request = (HttpServletRequest) ec.getRequest(); // 获取原始目标URL String redirectUrl = (String) request.getAttribute( "javax.security.enterprise.authentication.mechanism.http.LoginToContinue.REDIRECT_TO_AFTER_LOGIN" ); AuthenticationParameters params = AuthenticationParameters.withParams() .credential(new UsernamePasswordCredential(email, passwd)) .redirectTo(redirectUrl != null ? redirectUrl : "/default.xhtml"); return securityContext.authenticate( request, (HttpServletResponse) ec.getResponse(), params ); }
两种方案都能解决登录后停留在登录页的问题,认证成功后会自动跳转到用户最初请求的/user/user_index.xhtml,或默认页面。
内容的提问来源于stack exchange,提问作者Thomas P
相关产品推荐
相关产品推荐

