2010-09-20 107 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