在我的网络应用程序中,我有一个结帐流程,用户可以决定是否要登录。该过程是相同的,但通过登录,结帐过程中的数据将被预先填充。
购物车 - >继续/不登录 - >结帐
我知道如何使用容器管理登录“保护”特定页面,但是如何实现“可选登录”?我长时间在互联网上搜索,但只找到了传统的登录方法,不幸的是不是我需要的。
是否可以通过在操作方法的返回值中附加查询字符串来实现?
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中显示“登录选项”(我部分同意),但无论如何我用这种方式,因为用户可以自己决定是否要登录(通过点击不同的按钮),这不是安全问题。
答案 0 :(得分:2)
返回“checkout.xhtml?login-needed = true”;。
不要那样做。只是不要。您希望在人类可读文本的URL中显示的最后一项是登录或不登录的选项。
您的案例中的可选登录意味着两件事:
使用Servlet 3.0's programmatic login手动管理结帐页面的身份验证。程序化登录提供以下方法来处理身份验证
login()
将允许您将用户凭据手动输入您配置的域。这样,您就可以在目标页面上的preRenderView
事件中执行身份验证。
authenticate()
将允许您使用<form-login-config>
中配置的表单执行检查。缺点(IMO)在JSF之外,它最好位于过滤器中。
因此,从安全约束中删除签出允许您根据某些条件手动进行身份验证。
唯一剩下的就是如何与结账页面进行通信,认证是否需要认证。您需要提出一种更具创造性的方法,可能会在GET请求中散列不可读的值,以表示任何一种情况下的登录状态。绝对不要只说“login = yes”
在您的问题中,这些也可能会让您感兴趣
答案 1 :(得分:0)
我会考虑使用spring security并授予匿名用户访问您网页的权限。如果用户是匿名的,则为hide个特定组件。