2

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

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

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

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

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

4

2 回答 2

2

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

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

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

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

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

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

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

剩下的唯一事情是如何与结帐页面沟通是否需要身份验证。你需要想出一个更有创意的方法,也许在 GET 请求中散列一个不可读的值来表示任何一种情况下的登录状态。绝对不要只说“login=yes”

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

于 2013-05-12T03:19:53.113 回答
0

我会考虑使用弹簧安全性并授予匿名用户访问您的页面的权限。如果用户是匿名的,则隐藏特定组件。

于 2013-05-11T08:38:15.153 回答