2012-06-05 66 views
0

的J2EE 6標準教程顯示用戶認證的處理如下:處理用戶身份驗證的JSF 2.0代碼是什麼?

<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_security_check」特殊領域「爲j_username」和「爲j_password」。

*在JSF 2.0中可以做到這一點嗎?
*驗證成功後,j_username/j_password字段是否可用?更確切地說,如何在通過身份驗證後識別用戶?

任何簡單的示例代碼片斷將不勝感激。

+0

你應該可以使用上面的代碼;請查看[ExternalContext](http://docs.oracle.com/javaee/6/api/javax/faces/context/FacesContext.html#getExternalContext%28%29)以訪問容器管理的憑據。 – McDowell

+0

我應該補充一點,我的動機是在我的應用程序中充分利用所有外觀和感覺的東西,我得到了我的JSF模板,Primefaces主題等等。通過像上面那樣「沉浸於」HTML,我必須做更多的工作: - )也就是說,我試圖避免必須解決所有CSS引用,類標籤等,並手動構建一個外觀和感覺與我的應用程序的其餘部分一樣的HTML登錄頁面。 – smagrath

回答

2

這可以在JSF 2.0中做到嗎?

是的。畢竟只是一堆HTML,容器是做驗證的人,而不是JSF本身。另一種方法是通過編程登錄HttpServletRequest#login()。這使您可以使用基於JSF的驗證,ajax fanciness和全部的全功能JSF表單。也看到這個答案的一個開球例如:Does JSF support form based security


是否可以獲取認證成功後,爲j_username /爲j_password領域?更確切地說,如何在通過身份驗證後識別用戶?

只有用戶名可用通過ExternalContext#getRemoteUser()和觀點通過#{request.remoteUser} JSF上下文。由於明顯的安全原因,密碼不可用。

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();