jsf - JSF 中的可选登录

标签 jsf jakarta-ee authentication

在我的网络应用程序中,我有一个结帐流程,用户可以决定是否要登录。过程是相同的,但登录后结账过程中的数据会被预先填充。

购物车 --> 登录/不登录继续 --> 结帐

我知道如何使用容器管理登录来“保护”特定页面,但如何实现“可选登录”?网上查了好久,只找到了常规的登录方法,可惜不是我需要的。

有没有办法将查询字符串附加到操作方法的返回值中?

public  String withLogin () {
   return "checkout.xhtml?login=true";
}

public String noLogin() {
   return "checkout.xhtml";
}

感谢任何帮助和想法。


解决方案:

根据 kolossus 的回答,我找到了解决方案。验证方法是我需要的,但没有找到。

因此,我实现了一个 WebFilter,它根据上面提到的从 ManagedBean 返回的 url 参数 login=true 进行身份验证。

@WebFilter("/order/checkout.xhtml")
public class LoginFilter implements Filter{

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        if(("true").equals(req.getParameter("login"))) {
            req.authenticate((HttpServletResponse) response);
        }       
        chain.doFilter(request, response);      
    }

    // init and destroy Method
}

虽然 kolossus 说不应该在 URL 中显示“登录选项”(我部分同意),但我还是用了这种方式,因为用户可以自己决定是否要登录(通过单击不同的按钮),这不是安全问题。

最佳答案

return "checkout.xhtml?login-needed=true";.

不要那样做。只是不要。您最不想在 URL 中以人类可读的文本显示的内容是登录或不登录的选项。

在您的情况下,可选登录意味着两件事:

  1. 从应用的全局安全领域中删除结账页面
  2. 使用Servlet 3.0's programmatic login手动管理结帐页面的身份验证。编程式登录提供以下方法来处理身份验证

    • login()将允许您将用户凭据手动输入到您配置的领域。这样,您就可以在 preRenderView 中执行身份验证。目标页面上的事件。

    • authenticate()将允许您使用 <form-login-config> 中配置的表单执行检查。缺点(IMO)是它最好位于 JSF 之外,可能在过滤器中。

因此,从安全约束中删除结帐允许您根据某些条件手动进行身份验证。

剩下的唯一事情是如何与结账页面传达是否需要身份验证的信息。您需要想出一种更有创意的方法,也许将不可读的值散列到 GET 请求中以表示任一情况下的登录状态。绝对不要只说“login=yes”

根据您的问题,您可能也会对这些感兴趣

关于jsf - JSF 中的可选登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16494954/

相关文章:

java - 使用 JSF 进行连续式导航 - 返回上一页

jakarta-ee - 如何为 Tomcat 的 web.xml 中的所有 servlet 全局设置 Jasper 初始化参数?

升级到 WAS 7 后的 javax.servlet.UnavailableException

ruby-on-rails - Authlogic 和 OpenID 一次注册和登录

api - 如何验证 Azure Active Directory 用户凭据?

java - 如何在jsf中获取应用程序范围变量?

java - JSF/Primefaces : Open dialogue by click on datatable entry

css - primefaces 数据表宽度渲染不好

hibernate - 使用 Hibernate 验证创建组验证的步骤

angular - 由 aws API 制作的 HttpRequest 拦截器