【问题标题】:What is the JSF 2.0 code for handling user authentication?用于处理用户身份验证的 JSF 2.0 代码是什么?
【发布时间】:2012-06-05 09:25:38
【问题描述】:

J2EE 6 的标准教程显示了用户身份验证的处理如下:

<form method="POST" action="j_security_check">
    <table cellpadding="0" cellspacing="0" border="0">
         <tr>
            <td align="right">Username:&nbsp;</td>
            <td>
                <input type="text" name="j_username">
             </td>
         </tr>
         <tr>
             <td align="right">Password:&nbsp;</td>
             <td>
                <input type="password" name="j_password">
             </td>
         </tr>
         <tr>
             <td></td>
             <td>
                 <input type="submit" value="Login">
             </td>
        </tr>
    </table>
</form>

该方法使用具有特殊字段“j_username”和“j_password”的特殊容器函数“j_security_check”。

* 这可以在 JSF 2.0 中实现吗?
* 认证成功后 j_username/j_password 字段是否可用?更准确地说,用户通过身份验证后如何识别?

任何简单的示例代码 sn-ps 将不胜感激。

【问题讨论】:

  • 你应该可以使用上面的代码;查看ExternalContext 以访问容器管理的凭据。
  • 我应该补充一点,我这样做的动机是利用我的应用程序中的所有外观和感觉的东西,我得到我的 JSF 模板、Primefaces 主题等。通过像上面那样“简化”到 HTML,我必须做更多的工作 :-) 也就是说,我试图避免必须计算所有 CSS 引用、类标签等,并手动构建一个看起来和感觉就像我的应用程序其余部分的 HTML 登录页面。

标签: jsf jakarta-ee login


【解决方案1】:

这可以在 JSF 2.0 中实现吗?

是的。毕竟只是一堆 HTML,而容器是进行身份验证的人,而不是 JSF 本身。另一种方法是通过HttpServletRequest#login() 进行程序登录。这使您可以使用具有基于 JSF 的验证、ajax 幻想等功能的完整 JSF 表单。另请参阅此答案以获取启动示例:Does JSF support form based security


认证成功后 j_username/j_password 字段是否可用?更准确地说,用户通过身份验证后如何识别?

只有用户名在 ExternalContext#getRemoteUser() 可用的 JSF 上下文中和 #{request.remoteUser} 的视图中。出于明显的安全原因,该密码不可用。

【讨论】:

    【解决方案2】:
    1. 很久以前,我尝试使用 Spring Security 完成一个 jsf (1.2) 登录页面。但是,由于我没有成功,我最终放弃了,并像您在上面那样使用“常规” jsp 来做到这一点。

    2. 您可以通过将当前 SessionContext 注入您的 EJB 来识别当前用户:

      @Resource
      SessionContext sessionContext;
      public void doSth() {
          log.info("The current user's name is: " 
             + sessionContext.getCallerPrincipal().getName() );
      }
      

      你可以在 HttpServletRequest 上做同样的事情:

      request.getUserPrincipal();
      

      或来自 FacesContext:

      FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal();
      

    【讨论】:

      猜你喜欢
      • 2012-02-23
      • 2012-10-07
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      相关资源
      最近更新 更多