2010-09-20 10 views
4

Je dois limiter l'accès à une partie de l'application. Afin d'accéder à cette partie, l'utilisateur doit se connecter. J'ai une table dans ma base de données appelée Utilisateur, avec des noms d'utilisateur et des mots de passe hachés et un formulaire de connexion qui se compose de deux entrées et un soumettre. Cependant, je ne sais pas quelles classes/mathids devrais-je utiliser pour me connecter à l'utilisateur (je suppose qu'il y a un support pour cette fonctionnalité dans jsf). Aussi, autant que je sache, j'ai besoin d'éditer mon web.xml pour supporter l'authentification. Est-ce que quelqu'un pourrait proposer des solutions typiques et des étapes générales que je dois faire pour obtenir cette fonctionnalité (liens, tutoriels d'une valeur grandement appréciée)?JSF 2.0 Simple page de connexion

Je me demande également comment limiter l'accès à une autre page si la personne n'est pas connectée, donc quand l'utilisateur tape le lien direct vers une page, il sera redirigé vers une page de connexion principale.

Merci d'avance pour toute aide. Grem.

Répondre

2

Vous pouvez utiliser j_security_check. Tout ce que vous faites est post-it, et il gérera l'authentification basée sur le domaine que vous avez défini, et la configuration spécifique à l'application dans votre fichier web.xml. En fonction de votre serveur d'applications, une étape supplémentaire consiste à lier le rôle défini (spécifique à l'application) à un groupe (spécifique à un domaine).

Voici une configuration typique:

<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> 

Notez le security-role. Cela doit toujours être lié à un groupe ou à tout ce que vous définissez pour différencier les utilisateurs qui peuvent utiliser une page d'utilisateurs qui ne le peuvent pas.

+0

Merci beaucoup, Zack. N'y a-t-il pas d'autre moyen que d'utiliser j_security_check? Je sais qu'il existe une classe avec des méthodes de connexion et de déconnexion que je pourrais utiliser mais dont je ne me rappelle pas le nom. – grem

4

Vous pouvez utiliser l'API HttpServletRequest introduit dans Servlet 3.0:

/** 
    * 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

Ceci ne fait pas partie de JSF 2. Cela fait partie de Servlet 3.0. Donc, cela ne fonctionne que lorsque vous utilisez JSF 1.x/2.x/any sur Tomcat 7, Glassfish 3, JBoss AS 6, etc ou plus récent. – BalusC

+0

@BalusC merci de le signaler. J'ai adapté la réponse en conséquence. – Theo

+0

Avez-vous une solution pour Servlet 2.5? J'utilise JBoss5.1 qui utilise Java5. Donc je ne peux pas l'utiliser. S'il vous plaît, serait génial si vous avez des suggestions. – Tioma