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 :

Problème d'authentification en Java/J2EE


Sujet :

JSF Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 57
    Points : 36
    Points
    36
    Par défaut Problème d'authentification en Java/J2EE
    Bonjour,

    Je viens de développer une application en java/J2EE avec du JSF.

    Mon application se compose de plusieurs pages dont une page d'authentification où l'utilisateur entre son login/mp.

    Le problème est que s'il rentre directement dans la barre d'adresse l'url d'une page de l'application sans être loger (il saute ainsi la page accueil authentification), il accède au contenu de cette dernière.

    Comment faire pour empêcher cela ?

    Merci d'avance pour vos réponses.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Soit tu le fais à la main en utilisant les filtres, soit tu paramètres ton fichier web.xml pour protéger tes pages.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    Merci pour ta réponse.

    Soit tu le fais à la main en utilisant les filtres
    Désolé, mais je vois pas trop ce que tu veux dire.
    En effet, si on se connecte à la page accueil alors on a bien la page authentification qui est ouverte ou l'utilisateur doit entrer son mot de passe et valider pour accéder à la page suivante.

    Le problème est comment empêcher que l'utilisateur entre dans la barre d'adresse du navigateur: http://localhost/Appli/page2.jsp...
    Dans ce cas il saute la page http://localhost/Appli/authentification.jsp...

    soit tu paramètres ton fichier web.xml pour protéger tes pages.
    Et je ne vois pas comment paramétrer cela dans le fichier web.xml

    Merci d'avance.

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Filtre :

    Lorsque tu fais l'authentification, tu places quelque chose dans la session qui permette de savoir que tu es authentifié.
    Ton filtre n'a plus qu'à tester cet objet et en cas d'absence, rediriger vers l'authentification.

    web.xml :

    Il faut mettre en place les sécurités via <security-constraint>


    La solution 2 est la mieux...

  5. #5
    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
    Un filtre est une classe java par laquelle passent toutes tes requetes d'accès au serveur, tu peux donc y programmer le fait que si une session n'est pas ouverte alors il te redirige automatiquement dans la page de login.exemple de 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>name_filter</filter-name>
      <filter-class>ton_package.TaClasseFilter</filter-class>
     </filter>
    Utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <filter-mapping>
      <filter-name>name_filter</filter-name>
      <url-pattern>/*</url-pattern>
     </filter-mapping>
    Et un exemple de ta 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
     
     
    public class TaClasseFilter implements Filter{
     
      /**
       * 
       */
      public void destroy() {
        // TODO Auto-generated method stub
        /**
         * 
         */
      }
     
      /**
       * 
       */
      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)) { 
        	  String timeoutUrl = null;
        	  timeoutUrl = hRequest.getContextPath() + ConstantDivers.LOGIN_URL_PAGE;
            if (checkSession(hRequest)) { 
              logger.info("doFilter :Session is invalid!");
              hResponse.sendRedirect(timeoutUrl); 
              return; 
            }
              if (hRequest.getSession(false) != null) { 
                HttpSession session = hRequest.getSession(false);
                AbstractUser aUser = (AbstractUser)session.getAttribute(ConstantDivers.CURRENT_USER_IN_SESSION);
                if (aUser == null) { 
                  logger.info("Session is invalid! redirecting to login Page: {}");
                  hResponse.sendRedirect(timeoutUrl);
                  return; 
              }
            }
          }
     
        } 
        filterChain.doFilter(request, response); 
      } 
     
      @SuppressWarnings("cast")
      private boolean checkResource(HttpServletRequest request) { 
        String requestPath = request.getRequestURI(); 
        HttpServletRequest hRequest = (HttpServletRequest) request; 
        logger.debug("checkResource"+ requestPath);
        return !(requestPath.contains("css") || requestPath.contains(ConstantDivers.LOGIN_URL_PAGE) ||  requestPath.equals(hRequest.getContextPath() + "/"));
     
      } 
     
      private boolean checkSession(HttpServletRequest request) { 
        return request.getRequestedSessionId() != null 
            && !request.isRequestedSessionIdValid(); 
      } 
     
     
      /**
       * 
       */
      public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
     
      }
    }

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Ce qui est placé dans ton répertoire WEB-INF n'est pas accessible directement via l'URL.
    C'est déjà un bon début.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    Merci pour ta réponse.

    Dans un premier temps je vais utiliser la solution 1...

    Pour cela je fais dans ma page JSP:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <%
    PaydClientBean bean =(PaydClientBean)session.getAttribute("clientBean");
    			
    if(!bean.isConnect())
    {
          // Erreur il faut afficher la page d'acceuil
          // Comme faire cette redirectino en java ?????
    }
    %>
    Merci d'avance pour votre aide.

  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
    Si tu veux utiliser les filtres, suis simplement mon exemple. t'as rien comme programmation dans tes jsp.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    Ce qui est placé dans ton répertoire WEB-INF n'est pas accessible directement via l'URL.
    C'est déjà un bon début.
    Donc je mets toutes mes pages dans le dossier WEB-INF sauf ma page authentification. D
    ans mon fichier faces-config devant toutes mes adresses de page je rajoute :

    Au lieu de:

    <from-view-id>/page1.jsp</from-view-id>
    <navigation-case>
    <from-outcome>success</from-outcome>
    <to-view-id>/page2.jsp</to-view-id>


    je fais

    <from-view-id>WEB-INF/page1.jsp</from-view-id>
    <navigation-case>
    <from-outcome>success</from-outcome>
    <to-view-id>WEB-INF/page2.jsp</to-view-id>


    Où le WEB-INF est inutile ???

    Merci d'avance pour votre aide, vous êtes super sympa.

  10. #10
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <to-view-id>/WEB-INF/page2.jsp</to-view-id>

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    Bonjour,

    Merci pour toute vos réponses.
    Je pense que je vais utiliser les Filtres.

    Un filtre est une classe java par laquelle passent toutes tes requetes d'accès au serveur, tu peux donc y programmer le fait que si une session n'est pas ouverte alors il te redirige automatiquement dans la page de login.exemple de filtre :
    Le problème c'est que la méthode dont parle DevServlet n'existe pas.

    En effet, au lieu de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public void doFilter(ServletRequest request, ServletResponse response, 
        FilterChain filterChain)
    j'ai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void doFilter(HttpExchange arg0, Chain arg1)
    Quelqu'un pourrais me donner une piste, svp ?

  12. #12
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Tu n'utilises pas javax.servlet.Filter

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    Elle est dans quel jar cette classe ?

  14. #14
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    C'est quand même dommage de ne pas utiliser la deuxième solution, comme te l'a recommandé OButterlin.
    C'est pas très long à mettre en place, et tu n'as surtout aucun code à écrire; juste un peu config.

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    Oui mais le problème c'est que je n'ai pas réussi à le faire.
    En effet, le mapping ne fonctionne.

    Quand je valide mon formulaire authentification alors il appele l'url suivante
    http://localhost/Appli/WEB-INF/page2.jsp et là j'ai une erreur....

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    Bonjour,

    Je viens de mettre en place les Filters... Une vérification est bien faire à chaque appel d'une de mes pages.

    Si la session est expirée ou que je ne suis pas identifié alors je retourne sur la page login automatiquement. j'ai utilisé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hResponse.sendRedirect(hRequest.getContextPath()+ "/authentification.jsp");
    dans mon doFilter

    Cependant, comment dans le cas où il n'y a pas d'erreur afficher la page prévu lors de l'appel... En effet, j'ai essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hResponse.sendRedirect(hRequest.getRequestURL().toString());
    mais j'ai l'erreur de firefox qui me dit que la requête du serveur ne pourra aboutir...

    Si quelqu'un connais la solution... Merci d'avance

  17. #17
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Et bien, ce n'est pas compliqué, quand tout est OK tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    chain.doFilter(request, response);
    ...

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    Bonjour,

    Juste une précision sur le fonctionnement du Filter...

    Voilà ce que je fais actuellement:

    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
    public void doFilter(ServletRequest request, ServletResponse response,
    			FilterChain arg2) throws IOException, ServletException 
        {
    
    		HttpServletRequest hRequest = null;	
    		 HttpServletResponse hResponse = null;	
    		  if ((request instanceof HttpServletRequest) 
    			      && (response instanceof HttpServletResponse)) { 
    			      hRequest = (HttpServletRequest) request; 
    			      hResponse = (HttpServletResponse) response; 
    		  }
    		  
    		// Tester la Session
    			      
    		MonObjet obj= null;     
    		
    		try {
    			obj= (MonObjet) hRequest.getSession().getAttribute("monObjet");
    		} catch (Exception e) {
    			System.out.println("Erreur: session expire");
    			hResponse.sendRedirect(hRequest.getContextPath());
    		}
    		
    		if(obj== null){
    			// rediriger vers page erreur
    			hResponse.sendRedirect(hRequest.getContextPath());
    		} 
    		else {
    			// tester authentification
    			if(!obj.isConnect())
    			{				hResponse.sendRedirect(hRequest.getContextPath()+ "/index.jsp");
    			}
    		}
    		
    
    		hResponse.sendRedirect(hRequest.getRequestURL().toString());
    
    		
    	}
    mais quand je fais le sendRedirect ça fait quoi exactement ?

    Si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chain.doFilter(request, response);
    ça fait quoi ? Où le rajouter

    En effet, n'y a t'il pas un risque de tourner en boucle. Je vais appeler la page2, le filter est appelé tout est Ok, j'appelle donc la page 2... On rerendre dnas le filter non ?

    Merci d'avance pour votre aide.

  19. #19
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    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
     
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
    {
        MonObjet obj = null;
        try 
        {
            // Tester la Session
            obj = (MonObjet) ((HttpServletRequest)request).getSession().getAttribute("monObjet");
        } 
        catch (Exception e) 
        {
            System.out.println("Erreur : Non authentifié !");
        }
     
        if(obj == null || !obj.isConnect())
        {
            response.sendRedirect(hRequest.getContextPath()+ "/index.jsp");
        }
        else
        {
            chain.doFilter(request, response);
        }
    }

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 57
    Points : 36
    Points
    36
    Par défaut
    C'est bon ça marche. Merci beaucoup pour votre aide.
    C'est toujours sympa d'avoir des personnes qui sont prêtes à vous aider...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'authentification application j2EE
    Par momy2014 dans le forum Développement Web en Java
    Réponses: 3
    Dernier message: 13/05/2015, 22h38
  2. Réponses: 1
    Dernier message: 27/05/2014, 22h53
  3. Problème d'authentification Java
    Par RimyAD dans le forum JDBC
    Réponses: 3
    Dernier message: 04/11/2013, 06h28
  4. Problème de compilation avec Java J2EE
    Par izem23 dans le forum Java EE
    Réponses: 1
    Dernier message: 07/07/2010, 16h54
  5. Réponses: 3
    Dernier message: 02/06/2008, 16h43

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