在我的网络应用程序中,我有一个结帐流程,用户可以决定是否要登录。过程是相同的,但登录后结账过程中的数据会被预先填充。
购物车 --> 登录/不登录继续 --> 结帐
我知道如何使用容器管理登录来“保护”特定页面,但如何实现“可选登录”?网上查了好久,只找到了常规的登录方法,可惜不是我需要的。
有没有办法将查询字符串附加到操作方法的返回值中?
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 中以人类可读的文本显示的内容是登录或不登录的选项。
在您的情况下,可选登录意味着两件事:
- 从应用的全局安全领域中删除结账页面
使用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/