2013-05-11 35 views
2

在我的Web应用程序中,我有一个结帐过程,用户可以决定是否要登录。这个过程是一样的,但是登录过程中的数据会被预填充。在JSF中可选登录

购物车 - >继续有/无登录 - >结账

我知道如何“安全”与容器管理的登录特定网页,但如何我实施“可选登录”?我长时间搜索了互联网,但只找到了登录的常规方法,不幸的是并不是我所需要的。

有没有办法通过追加查询字符串的行动方法的返回值?

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

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

不这样做。不要。您希望以可阅读文本的形式显示在URL中的最后一件事是用于登录或不登录的选项。你的情况

可选登录意味着两件事情:

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

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

    • authenticate()将允许您使用<form-login-config>中的配置表格执行检查。不足之处(IMO)认为这在JSF之外最好,在Filter中很可能。

因此,从安全性约束消除结帐可让您手动根据某些条件进行身份验证。

剩下的唯一问题是如何与结账页面进行通信,以验证是否需要验证。您需要想出一个更具创造性的方式,可能会将不可读的值散列到GET请求中以表示登录状态。绝对不要只说 “登录= YES”

在你的问题的情况下,这些也可能会感兴趣

+0

谢谢你的答案。但是,为什么我不应该显示“url = true”在url中?用户可以决定是否他想要登录,所以它使差异... – Manuel 2013-05-12 08:30:06

+0

@曼努埃尔,我不是说用户不应该通过点击不同的按钮来决定他的偏好,我所说的是您选择的参数名称在浏览器的地址栏中是可读的,并将您的实施细节暴露给肉眼。我在这里推荐你混淆参数名称和值,以便普通用户无法理解它。将一些变量放入一个看起来没有意义的参数中,看起来像“rand = r234u2yf9393yyry3aa1kv”对用户来说是没有意义的,他们不太可能想要篡改认证机制 – kolossus 2013-05-12 15:04:30

0

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

+0

谢谢您回答,但我认为你理解我错了。我会让用户决定他是否想要登录,如果他想登录(并在登录到他想去的页面后重定向),则显示登录表单。此外,不幸的是,它不可能在我们的项目中使用弹簧... – Manuel 2013-05-11 13:23:47

+0

好吧,我以为你想扩展功能,如果用户登录。 – dratewka 2013-05-11 13:37:11