可选登录JSF

时间:2013-05-11 07:41:18

标签: jsf java-ee login

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

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

我知道如何使用容器管理登录“保护”特定页面,但是如何实现“可选登录”?我长时间在互联网上搜索,但只找到了传统的登录方法,不幸的是不是我需要的。

是否可以通过在操作方法的返回值中附加查询字符串来实现?

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

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

感谢任何帮助和想法。


解决方案

根据kolossus的回答,我找到了解决方案。 authenticate-Method是我需要的,但没有找到。

所以我实现了一个WebFilter,它根据url paramater login = true进行身份验证,我从ManagedBean返回,如上所述。

@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中显示“登录选项”(我部分同意),但无论如何我用这种方式,因为用户可以自己决定是否要登录(通过点击不同的按钮),这不是安全问题。

2 个答案:

答案 0 :(得分:2)

  

返回“checkout.xhtml?login-needed = true”;。

不要那样做。只是不要。您希望在人类可读文本的URL中显示的最后一项是登录或不登录的选项。

您的案例中的可选登录意味着两件事:

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

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

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

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

    唯一剩下的就是如何与结账页面进行通信,认证是否需要认证。您需要提出一种更具创造性的方法,可能会在GET请求中散列不可读的值,以表示任何一种情况下的登录状态。绝对不要只说“login = yes”

    在您的问题中,这些也可能会让您感兴趣

答案 1 :(得分:0)

我会考虑使用spring security并授予匿名用户访问您网页的权限。如果用户是匿名的,则为hide个特定组件。