0

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 字段是否可用?更准确地说,在用户通过身份验证后如何识别用户?

任何简单的示例代码片段将不胜感激。

4

2 回答 2

2

这可以在 JSF 2.0 中实现吗?

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


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

Only the username is in JSF context available by ExternalContext#getRemoteUser() and in views by #{request.remoteUser}. The password is not available for obvious security reasons.

于 2012-06-07T04:28:26.577 回答
1
  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-06-06T06:34:36.143 回答