2010-09-20 105 views
4

我需要限制對部分應用程序的訪問。爲了訪問該部分,用戶需要登錄。我的數據庫中有一個名爲User的表,其中包含用戶名和散列密碼以及由兩個輸入和一個提交組成的登錄表單。但是,我不知道應該使用哪些類/ mathids來登錄用戶(我假設在jsf中支持此功能)。另外,據我所知,我需要編輯我的web.xml來支持驗證。有人可能會提出一個典型的解決方案和一般步驟,我需要做的才能獲得該功能(鏈接,價值教程非常讚賞)?JSF 2.0簡單登錄頁面

我還想知道如果用戶沒有登錄,我如何限制訪問另一個頁面,所以當用戶鍵入到頁面的直接鏈接時,他將被重定向到主登錄頁面。

在此先感謝您的幫助。 Grem。

回答

2

您可以使用j_security_check。你所要做的就是發佈給它,它將根據你定義的領域和web.xml中的特定於應用程序的配置來處理認證。

根據您的應用程序服務器,還有一個將定義的角色(特定應用程序)鏈接到組(特定於領域)的附加步驟。

下面是一個典型的配置:

<servlet> 
    <servlet-name>Login</servlet-name> 
    <servlet-class>com.example.Login</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Login</servlet-name> 
    <url-pattern>/Login</url-pattern> 
</servlet-mapping> 
<servlet> 
    <servlet-name>Error</servlet-name> 
    <servlet-class>com.example.Error</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Error</servlet-name> 
    <url-pattern>/Error</url-pattern> 
</servlet-mapping> 
<login-config> 
    <auth-method>FORM</auth-method> 
    <realm-name>example.com</realm-name> 
    <form-login-config> 
     <form-login-page>/Login</form-login-page> 
     <form-error-page>/Error</form-error-page> 
    </form-login-config> 
</login-config> 

<security-role> 
    <role-name>arbitraryRoleName</role-name> 
</security-role> 

<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>All Pages</web-resource-name> 
     <url-pattern>/index.xhtml</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>arbitraryRoleName</role-name> 
    </auth-constraint> 
</security-constraint> 

注意security-role。這仍然需要鏈接到一個組中,或者您正在定義的任何內容來區分不能使用用戶頁面的用戶。

+0

非常感謝,扎克。除了使用j_security_check之外,沒有別的辦法嗎?我知道有一個類可以使用登錄和註銷方法,但不記得它的名字。 – grem 2010-09-20 14:08:41

4

你可以使用Servlet 3.0中引入了HttpServletRequest的API:

/** 
    * Performs authentication via HttpServletRequest API 
    */ 
    public String login(String username, String password) throws IOException { 
     try { 
      getRequest().login(username, password); 
      this.user = userDao.find(username); 
     } catch (ServletException e) { 
      JsfUtil.addErrorMessage(JsfUtil.getStringResource("loginFailed")); 
      return null; 
     } 
     return "/index?faces-redirect=true"; 
    } 

    public String logout() throws ServletException { 
     this.user = null; 
     FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); 
     if (isAuthenticated()) 
      getRequest().logout(); 
     return "logout"; 
    } 

    public boolean isAuthenticated() { 
     return getRequest().getUserPrincipal() != null; 
    } 

    public static HttpServletRequest getRequest() { 
     Object request = FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
     return request instanceof HttpServletRequest 
       ? (HttpServletRequest) request : null; 
    } 
+2

這不是JSF 2的一部分。這是Servlet 3.0的一部分。所以這隻適用於在Tomcat 7,Glassfish 3,JBoss AS 6等等或更新版本上運行JSF 1.x/2.x /任何東西。 – BalusC 2011-06-03 11:44:20

+0

@BalusC感謝您指出。我相應地調整了答案。 – Theo 2011-06-03 15:02:23

+0

您有Servlet 2.5的解決方案嗎?我使用使用Java5的JBoss5.1。所以我不能使用它。請,如果您有任何建議,會很棒。 – Tioma 2011-10-25 19:28:38