IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JSF Java Discussion :

Utilisateur non authentifié , ne peut pas voir les autres formulaires?


Sujet :

JSF Java

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 45
    Points : 24
    Points
    24
    Par défaut Utilisateur non authentifié , ne peut pas voir les autres formulaires?
    Bonjour tous,
    Je veux ajouter ce truc de sécurité à mon application web:
    Si l'utilisateur est authentifié, il peut naviguer sur les autres interfaces de l'application.Si non: s'il demande une interface directement, il sera rédirigé automatiquement vers la 1ere interface de saisie.
    Et je veux appliquer ça sur quelques interfaces, les autres non.

    Merci d'avance
    (je travaille avec JPA, JBOSS , Richfaces..)

  2. #2
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Aucune idée ??

  3. #3
    Membre du Club

    Inscrit en
    Janvier 2006
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 44
    Points : 64
    Points
    64
    Par défaut
    Salut

    si tu travailles avec jboss seam alors utilise la doc de ref :
    http://docs.jboss.org/seam/1.2.1.GA/.../security.html

    Sinon tu peux bricoler quelque chose comme ça :
    http://www.developpez.net/forums/d54...utilisant-jsf/

  4. #4
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par michaelcourcy Voir le message
    Salut

    si tu travailles avec jboss seam alors utilise la doc de ref :
    http://docs.jboss.org/seam/1.2.1.GA/.../security.html

    Sinon tu peux bricoler quelque chose comme ça :
    http://www.developpez.net/forums/d54...utilisant-jsf/
    Merci michael pour votre réponse
    Mais ma question est un peu plus facile que ça je pense:
    c'est pas qu'un user a le droit à des pages et d'autres non, mais plutot
    que s'il n'est pas authentifié, et demande une page directement via son URL, il est automatiquement redirigé vers la premiere page d'authentification.
    Je travaille avec JSF-JBOSS

  5. #5
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Tu peux soit:

    - Utiliser la gestion de sécurité du serveur, securyty-constraints ...

    - Gérer la sécurité toit même, avec JSF, redéfinir le phaseListener, pour chaque requete avant la phase RENDER_RESPONSE, si l'utilisateur n'est pas en session, faire une redirection vers la page de login.

    -Utiliser un framework tel que spring security.

  6. #6
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Merci Sniper,
    En faite je vais aborder la premiere méthode
    A ce que j'ai compris, j'ajoute ça dans mon web.xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <security-constraint>
       <web-resource-collection>
         <web-resource-name>no_access</web-resource-name>
         <url-pattern>/restrict/*.jsp</url-pattern>
       </web-resource-collection>
       <auth-constraint/>
     </security-constraint>
    Le dossier restrict, est sous webContent, et dans lequel je vais mettre mes formulaires que je vais restreindre l'accés.
    Mais ils seront accéder via les régles de navigation déclarés dans face-config.xml.(c'est juste ce que je comprends?)
    Quands je faits ça, et je lance la page login.jsp, qui est hors ce dossier restrict, j'obtient l'erreur suivante

    Etat HTTP 404 - /TestJSF/faces/login.jsp

    type Rapport d'état

    message /TestJSF/faces/login.jsp

    description La ressource demandée (/TestJSF/faces/login.jsp) n'est pas disponible.
    JBossWeb/2.0.1.GA

  7. #7
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    l'erreur 404 n'a rien à voir avec ce que tu as déclaré pour la sécurité, peut tu as mal définis l'url mapping pour la servlet JSF, tu peux donner ce code du web.xml

  8. #8
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Moi je viens de faire un filtre qui marche bien, voila le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    package fr.msw.filter;
     
    import java.io.IOException;
     
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import fr.epide.utils.AbstractInformation;
    import fr.msw.abs.AbstractUser;
     
    /**
     * @author MOI
     *Filtre de rédirection à la page de connexion si perte de session
     */
    public class TimeoutFilter extends AbstractInformation implements Filter{
     
      private static final String TIMOUT_PAGE = "pages/login.jsf"; 
      private static final String LOGIN_PAGE = "pages/login.jsf";
      /* 
       * 
       */
      @Override
      public void destroy() {
        // TODO Auto-generated method stub
      }
     
      /**
       * 
       */
      @Override
      public void doFilter(ServletRequest request, ServletResponse response, 
        FilterChain filterChain) throws IOException, ServletException { 
        if ((request instanceof HttpServletRequest) 
          && (response instanceof HttpServletResponse)) { 
          HttpServletRequest hRequest = (HttpServletRequest) request; 
          HttpServletResponse hResponse = (HttpServletResponse) response; 
     
          if (checkResource(hRequest)) { 
            if (checkSession(hRequest)) { 
              String timeoutUrl = hRequest.getContextPath() + "/" + TIMOUT_PAGE;
              log.info(getClassName(), "doFilter", "Session is invalid! redirecting to timeoutpage : {}");
              hResponse.sendRedirect(timeoutUrl); 
              return; 
            }
              if (hRequest.getSession(false) != null) { 
                HttpSession session = hRequest.getSession(false);
                AbstractUser aUser = (AbstractUser)session.getAttribute("currentUser");
                if (aUser == null) { 
                  String timeoutUrl = hRequest.getContextPath() + "/" + TIMOUT_PAGE;
                  log.info(getClassName(), "doFilter", "Session is invalid! redirecting to timeoutpage : {}");
                  hResponse.sendRedirect(timeoutUrl);
              }
            }
          }
     
        } 
        filterChain.doFilter(request, response); 
      } 
     
      @SuppressWarnings("cast")
      private boolean checkResource(HttpServletRequest request) { 
        String requestPath = request.getRequestURI(); 
        HttpServletRequest hRequest = (HttpServletRequest) request; 
        log.debug(getClassName(), "checkResource", requestPath);
        //log.debug("reqPath={}", requestPath); 
        return !(requestPath.contains(TIMOUT_PAGE) ||  
            requestPath.contains(LOGIN_PAGE) ||  
          requestPath.equals(hRequest.getContextPath() + "/")); 
      } 
     
      private boolean checkSession(HttpServletRequest request) { 
        return request.getRequestedSessionId() != null 
            && !request.isRequestedSessionIdValid(); 
      } 
     
     
      /**
       * 
       */
      @Override
      public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
     
      }
    }
    Il teste 2 choses, si une session est en cours, si oui est ce une connexion ouverte par authentification.
    C'est un code que j'ai repris ici.
    Tu crées donc ta classe et ensuite tu la declare comme filtre dans ton web.xml

  9. #9
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Sniper37 Voir le message
    l'erreur 404 n'a rien à voir avec ce que tu as déclaré pour la sécurité, peut tu as mal définis l'url mapping pour la servlet JSF, tu peux donner ce code du web.xml
    Voila mon web.xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
      <display-name>TestJSF</display-name>
     <context-param>
    		<param-name>org.richfaces.SKIN</param-name>
    		<param-value>blueSky</param-value>
    	</context-param>
    <!-- Making the RichFaces skin spread to standard HTML controls -->
    	<context-param>
    		<param-name>org.richfaces.CONTROL_SKINNING</param-name>
    		<param-value>enable</param-value>
    	</context-param>
     
     
    <!-- Defining and mapping the RichFaces filter -->
     <filter>
    		<display-name>RichFaces Filter</display-name>
    		<filter-name>richfaces</filter-name>
    		<filter-class>org.ajax4jsf.Filter</filter-class>
    	</filter>
    	<filter-mapping>
    		<filter-name>richfaces</filter-name>
    		<servlet-name>Faces Servlet</servlet-name>
    		<dispatcher>REQUEST</dispatcher>
    		<dispatcher>FORWARD</dispatcher>
    		<dispatcher>INCLUDE</dispatcher>
    	</filter-mapping>
      <welcome-file-list>    
        <welcome-file>login.jsp</welcome-file>
      </welcome-file-list>
      <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
      </servlet-mapping>  
      
    </web-app>
    Quand j'ajoute ce bout de code ci dessous, ça affiche cet erreur 404...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <security-constraint>
       <web-resource-collection>
         <web-resource-name>no_access</web-resource-name>
         <url-pattern>/restrict/*.jsp</url-pattern>
       </web-resource-collection>
       <auth-constraint/>
     </security-constraint>

  10. #10
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Voila ma declaration du filtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <filter>
      <display-name>Session Filter</display-name>
      <filter-name>TimeoutFilter</filter-name>
      <filter-class>fr.msw.filter.TimeoutFilter</filter-class>
     </filter>
    Voila son mapping :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <filter-mapping>
      <filter-name>TimeoutFilter</filter-name>
      <url-pattern>/*</url-pattern> 
     </filter-mapping>
    Normalement ca devrait marcher.

  11. #11
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Au début, il ne m'a pas accepté @Override, donc je l'ai commenté.
    Et l'application a bien démarré sur la premiere page d'authentifification, je m'authentifie et je passe à la 2eme page. mais quand je veux passer à une autre page, il me rend une erreur: javax.servlet.ServletException: Impossible d'utiliser faire-suivre (forward) après que la réponse ait été envoyée
    Aussi je peux me connecter directement sur une autre page sans avoir authentifier.

  12. #12
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Peux tu me faire voir les bouts de code suivants :
    -Ta classe filter
    -Ta méthode de connexion
    -Ta méthode de déconnexion

  13. #13
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par DevServlet Voir le message
    Peux tu me faire voir les bouts de code suivants :
    -Ta classe filter
    -Ta méthode de connexion
    -Ta méthode de déconnexion
    Ma classe filter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
     
    import java.io.IOException;
     
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import fr.epide.utils.AbstractInformation;
    import fr.msw.abs.AbstractUser; 
     
    public class TimeoutFilter extends AbstractInformation implements Filter{
     
      private static final String TIMOUT_PAGE = "/login.jsp"; 
      private static final String LOGIN_PAGE = "/login.jsp";
     
     // @Override
      public void destroy() {
     
      }
     
     // @Override
      public void doFilter(ServletRequest request, ServletResponse response, 
        FilterChain filterChain) throws IOException, ServletException { 
        if ((request instanceof HttpServletRequest) 
          && (response instanceof HttpServletResponse)) { 
          HttpServletRequest hRequest = (HttpServletRequest) request; 
          HttpServletResponse hResponse = (HttpServletResponse) response; 
     
          if (checkResource(hRequest)) { 
            if (checkSession(hRequest)) { 
              String timeoutUrl = hRequest.getContextPath() + "/" + TIMOUT_PAGE;          
              hResponse.sendRedirect(timeoutUrl); 
              return; 
            }
              if (hRequest.getSession(false) != null) { 
                HttpSession session = hRequest.getSession(false);
                AbstractUser aUser = (AbstractUser)session.getAttribute("currentUser");
                if (aUser == null) { 
                  String timeoutUrl = hRequest.getContextPath() + "/" + TIMOUT_PAGE;
                  hResponse.sendRedirect(timeoutUrl);
              }
            }
          }
     
        } 
        filterChain.doFilter(request, response); 
      } 
     
      @SuppressWarnings("cast")
      private boolean checkResource(HttpServletRequest request) { 
        String requestPath = request.getRequestURI(); 
        HttpServletRequest hRequest = (HttpServletRequest) request; 
     
        return !(requestPath.contains(TIMOUT_PAGE) ||  
            requestPath.contains(LOGIN_PAGE) ||  
          requestPath.equals(hRequest.getContextPath() + "/")); 
      } 
     
      private boolean checkSession(HttpServletRequest request) { 
        return request.getRequestedSessionId() != null 
            && !request.isRequestedSessionIdValid(); 
      } 
     
     
      //@Override
      public void init(FilterConfig arg0) throws ServletException {
     
      }
    }
    Mes deux méthodes de connexion et deconnexion (mon petit probleme la, est qu'il ne m'affiche pas les messages d'erreur comme il faux sur le formulaire):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    private User currentUser = new User();
    private boolean logged = false;
    public String connect() {
    		try {
    			Context ctx = new InitialContext();
    			UserDAORemote userdao = (UserDAORemote) ctx.lookup("UserDAO/remote");
    			User result = userdao.connect(currentUser.getUsername(),
    					currentUser.getPassword());
    			if (result != null) {
    				currentUser = result;
    				logged=true;
    				return "authentifie";
    			}
     
    		} catch (Exception e) {
    			// e.printStackTrace();
    			String msg="impossible de vous connecter, veuillez vérifier vos identifiants";
    			FacesMessage facesMsg=new FacesMessage(msg);
    			FacesContext fc=FacesContext.getCurrentInstance();
    			fc.addMessage("login", facesMsg);
     
    		}
     
    		FacesContext.getCurrentInstance().addMessage(null,
    				new FacesMessage("username ou password faux"));
     
    		return null;
    	}
     
    	public String disconnect() {
    		setCurrentUser(new User());
    		logged = false;
    		return "acceuil";
    	}
    Dans mon web.xml, j'ai ajouté ces lignes la:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <filter>
      <display-name>Session Filter</display-name>
      <filter-name>TimeoutFilter</filter-name>
      <filter-class>myPackage.TimeoutFilter</filter-class>
     </filter>
     
    filter-mapping>
      <filter-name>TimeoutFilter</filter-name>
      <url-pattern>/*</url-pattern> 
     </filter-mapping>

  14. #14
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Tu n'as pas bien compris ce que j'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AbstractUser aUser = (AbstractUser)session.getAttribute("currentUser");
    aUser c'est l'utilisateur que je mets en session lorsqu'il y'a une bonne authentification avec l'attribut d'identification "currentUser". et à la deconnexion j'invalide ma session après avoir détruit cet utilisateur que j'avais mis en session. Tu n'utilises pas de session dans ton cas.
    Comment vx tu que ton filtre détecte la connexion et la deconnexion?
    Tu vois comment fonctionnent les sessions en java?

  15. #15
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par DevServlet Voir le message
    Tu n'as pas bien compris ce que j'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AbstractUser aUser = (AbstractUser)session.getAttribute("currentUser");
    aUser c'est l'utilisateur que je mets en session lorsqu'il y'a une bonne authentification avec l'attribut d'identification "currentUser". et à la deconnexion j'invalide ma session après avoir détruit cet utilisateur que j'avais mis en session. Tu n'utilises pas de session dans ton cas.
    Comment vx tu que ton filtre détecte la connexion et la deconnexion?
    Tu vois comment fonctionnent les sessions en java?
    ahhh, dsl j'ai changé ça, mais quand je vous ai copier le code, j'ai copier un ancien. Mais quand j'ai fait le test, c'est avec ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     User aUser=(User)session.getAttribute("currentUser");

Discussions similaires

  1. je ne peut pas explorer les fichiers de mon CD
    Par wodel dans le forum SUSE
    Réponses: 2
    Dernier message: 26/02/2007, 10h35
  2. Réponses: 7
    Dernier message: 15/12/2006, 09h22
  3. Comment ne pas voir les alertes de Access ?
    Par kaptnkill dans le forum Access
    Réponses: 6
    Dernier message: 12/07/2006, 16h49
  4. Réponses: 2
    Dernier message: 05/05/2006, 14h30
  5. Ne pas voir les liens d'une page !
    Par nicof3 dans le forum Langage
    Réponses: 3
    Dernier message: 25/04/2006, 12h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo