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

Wildfly/JBoss Java Discussion :

Rediriger vers un servlet après utilisation du login.html pour authentification


Sujet :

Wildfly/JBoss Java

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

    Informations forums :
    Inscription : Janvier 2013
    Messages : 57
    Points : 37
    Points
    37
    Par défaut Rediriger vers un servlet après utilisation du login.html pour authentification
    Bonsoir,

    je suis face à un problème durant mon développement d’application : celle-ci est une appli Java JEE utilisant Jboss (wildfly).
    J'aimerais mettre en place un système d'authentification, pour cela j'utilise le fichier login.html suivant :

    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
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
              "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    	<head>
    	  <title>Identification</title>
    	</head>
     
    	<body>
    		<form action="j_security_check" method="post">
    			<table>
    				<tr>
    					<td> Login : </td>
    					<td><input type="text" autocomplete="off" name="j_username" /></td>
    				</tr>
    				<tr>
    					<td> Mot de Passe :	</td>
    					<td><input type="password" autocomplete="off" name="j_password" /></td>
    				</tr>
    			</table>
     
    			<input type="submit" value="Connexion" />
    		</form>
     
    	</body>
     
    </html>
    Ici on fait appel à l'action j_security_check pour enregistrer les identifiants afin de procéder aux contrôles d'accès à certains servletts plus tard. Cependant, j'aimerais également faire d'autres traitements comme par exemple enregistrer le login de l'utilisateur dans une variable session lorsque la connexion se passe bien.
    Dans tous les tutoriels que j'ai vu sur internet, les gens tapaient explicitement l'url d'accès à un contrôleur depuis le navigateur pour y accéder après authentification de cette manière là.
    J'aimerais que cela se fasse automatiquement, seulement comme on utilise déjà l'action j_security_check je ne peux pas rediriger vers un de mes servlett.

    Auriez-vous des suggestions ?

  2. #2
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    bonjour,

    Utilises tu un framework pour géré l'authentification / authorisation ?
    Sinon cela te faciliterais grandement la prise en charge.
    Personnellement, j'utilise Apache Shiro, il est très complet et facile a mettre en place.
    De plus il garde un état des sessions par utilisateur et l'authorisation très fine ce qui correspond a ce que tu souhaites faire !
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    Comme tu utilises une authentification JAAS, il faudrait passer par un custom login module pour faire des actions spécifiques.
    Tu peux étendre par exemple la classe UsernamePasswordLoginModule et redéfinir la méthode login()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public boolean login() throws LoginException
    {
        boolean ok = super.login();
        if (ok)
        {
            // faire un truc spécifique....
        }
    }
    Dans le fichier standalone.xml, il faudra définir ton domaine de sécurité dans ce genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <security-domain name="mon-domaine-auth" cache-type="default">
       <authentication>
          <login-module code="le.package.LoginModuleSpecifique" flag="required" module="si_besoin">
             <module-option name="password-stacking" value="useFirstPass"/>
          </login-module>
       </authentication>
    </security-domain>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 57
    Points : 37
    Points
    37
    Par défaut
    Merci pour vos réponses, je vais explorer la piste fournie par OButterlin.
    Du coup, dans la conditionnelle if(ok) c'est là que je vais travailler avec mes variables de session. Cependant comment j'y accède ?
    Dans mes servletts j'avais un objet HttpServletRequest dans lequel je travaillais avec mes variables de session.

    J'ai déjà un security-domain qui ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <security-domain name="secureDomain" cache-type="default">
        <authentication>
            <login-module code="Database" flag="required">
                <module-option name="dsJndiName" value="java:jboss/datasources/UserDS"/>
                <module-option name="principalsQuery" value="select passwd from Users where username=?"/>
                <module-option name="rolesQuery" value="select role, 'Roles' from UserRoles where username=?"/>
            </login-module>
        </authentication>
    </security-domain>

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    Autant pour moi, si tu veux faire un traitement avec la session, il vaut mieux passer par un "custom valve", d'ailleurs, c'est encore plus simple
    Tu crées une classe qui étend ExtendedFormAuthenticator comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class CustomAuthenticator extends ExtendedFormAuthenticator
    {
        @Override
        public boolean authenticate(Request request, HttpServletResponse response, LoginConfig loginConfig) throws IOException
        {
            boolean result = super.authenticate(arg0, arg1, arg2);
            if (result)
            {
                  // ici, tu fais ton traitement
            }
            return result;
        }
    }
    Ensuite, il faut créer un fichier jboss-web.xml qui ressemblera à ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?xml version="1.0" encoding="UTF-8"?>
    <jboss-web>
       <security-domain>mon-application-auth</security-domain>
       <valve>
               <class-name>mon.package.CustomAuthenticator</class-name>
       </valve>
    </jboss-web>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 57
    Points : 37
    Points
    37
    Par défaut
    Je vais essayer ça merci, en revanche il faut que j'utilise une librairie spécifique dans mon projet JBoss pour accéder à cette classe ExtendedFormAuthenticator ?
    J'ai essayer de faire import org.jboss.web.tomcat.security.ExtendedFormAuthenticator; mais ça ne donne rien.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    J'utilise catalina-7.0.0.1.jar
    et jboss-as-web-7.1.1.Final.jar (D:\JBoss_Servers\jboss-as-7.1.1.Final\modules\org\jboss\as\web\main)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 57
    Points : 37
    Points
    37
    Par défaut
    En effet il me manquait ces bibliothèques.
    Par contre quand je lance mon appli, une fois que je me suis connecté via ce fichier login.html :
    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
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
              "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    	<body>
    		<form action="j_security_check" method="post">
    			<table>
    				<tr>
    					<td> Login : </td>
    					<td><input type="text" autocomplete="off" name="j_username" /></td>
    				</tr>
    				<tr>
    					<td> Mot de Passe :	</td>
    					<td><input type="password" autocomplete="off" name="j_password" /></td>
    				</tr>
    			</table>
     
    			<input type="submit" value="Connexion" />
    		</form>
     
    	</body>
     
    </html>
    l'appli me redirige automatiquement sur une page blanche dont le titre de l'onglet est "j_security_check".
    Pourtant dans mon CustomAuthenticator j'ai mis dans le if(result) qu'il fallait rediriger vers un de mes servlets.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    Je ne saisis pas bien ce que tu fais... tu veux dire que dans le custom valve tu fais un response.sendRedirect(...) ?
    Peux-tu montrer le code actuel ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 57
    Points : 37
    Points
    37
    Par défaut
    Alors en fait voilà mon CustomAuthenticator :
    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
     
    package servlet;
     
    import java.io.IOException;  
     
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletResponse;
     
    import org.apache.catalina.connector.Request;
    import org.apache.catalina.deploy.LoginConfig; 
    import org.jboss.as.web.security.ExtendedFormAuthenticator;
     
    public class CustomAuthenticator extends ExtendedFormAuthenticator{
     
    	@Override
    	public boolean authenticate(Request request, HttpServletResponse response, LoginConfig loginConfig) throws IOException {
    		boolean result = super.authenticate(request, response, loginConfig);
                    if (result){
                          try {
    	                   request.getRequestDispatcher("accueil.jsp").forward(request, response);
    		      } catch (ServletException e) {
    			   e.printStackTrace();
    		      }
                    }
                    return result;
    	}	
    }
    Mais même en lançant en mode debug, une fois avoir cliqué sur le bouton de connexion, je ne passe même pas dans ce code là.
    Voici mon jboss-web.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?xml version="1.0" encoding="UTF-8"?>
    <jboss-web>
    	<security-domain>secureDomain</security-domain>
    	<valve>
               <class-name>servlet.CustomAuthenticator</class-name>
       	</valve>
    </jboss-web>
    Et voici la définition de mon domaine de sécurité dans le standalone.xml de wildfly :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <security-domain name="secureDomain" cache-type="default">
        <authentication>
            <login-module code="Database" flag="required">
                <module-option name="dsJndiName" value="java:jboss/datasources/UserDS"/>
                <module-option name="principalsQuery" value="select passwd from Users where username=?"/>
                <module-option name="rolesQuery" value="select role, 'Roles' from UserRoles where username=?"/>
            </login-module>
        </authentication>
    </security-domain>
    Ou bien mon path dans la balise class-name du jboss-web.xml est incorrect ou bien le fait de définir mon security-domain comme ceci gêne le processus.
    Qu'en penses-tu ?

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    C'est curieux...

    Voici les différences par rapport à ce que j'utilise :

    - j'utilise un JBoss7 (mais je ne pense pas que la version 9 soit différente)
    - chez moi, le custom valve est dans un jar à part inclut dans /WEB-INF/lib (toi tu l'as directement dans le projet)
    - la définition du domaine de sécurité fait référence à un autre type de module d'authentification puisque j'en ai un spécifique

    A part ça, je ne vois rien d'anormal...
    Tu as bien le fichier jboss-web.xml dans /WEB-INF/ ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 57
    Points : 37
    Points
    37
    Par défaut
    Je ne vois pas non plus, j'ai effectivement le jboss-web.xml dans le WEB-INF.

    De ton côté ça fonctionne ? Si oui tu pourrais me filer un petit zip de ton projet test ?

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    Tu peux essayer cette application de test, il faudra juste mettre tes valeurs pour le security-domain dans le jboss-web.xml
    Fichiers attachés Fichiers attachés
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 57
    Points : 37
    Points
    37
    Par défaut
    Je ne vois pas pourquoi ça ne tourne pas chez moi, je vais quand même garder ton zip

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    Tu as une log ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    Bon, j'ai monté un serveur WildFly 9.0.1 et le résultat est sans appel : ça ne fonctionne plus !

    En regardant sur le net, il semble que le support des valves a été abandonné dans la mesure où ça vient de Tomcat (ça, je peux comprendre)
    Du coup, il suggère de passer par un simple filtre (javax.servlet.Filter) qui est largement portable.
    C'est vrai que je t'ai embarqué dans une solution un peu compliquée pour ce que tu veux faire (parce que j'utilise le custom valve pour différencier des types d'authentifications)
    La solution Filter serait plus simple...
    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
    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;
     
    public class CustomFilter implements Filter
    {
        @Override
        public void destroy()
        {
        }
     
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
        {
            if (request instanceof HttpServletRequest)
            {
                HttpServletRequest req = (HttpServletRequest)request;
                if (req.getUserPrincipal() != null)
                {
                    System.out.println("Utilisateur authentifié");
                }
                chain.doFilter(request, response);
            }
        }
     
        @Override
        public void init(FilterConfig arg0) throws ServletException
        {
        }
    }
    dans la partie userprincipal != null, tu n'as qu'à tester une variable de session pour déterminer si tu as déjà fait le travail complémentaire ou non
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Rediriger vers une page après un compte à rebours
    Par HAbroc dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 09/06/2014, 13h31
  2. rediriger vers une servlet
    Par cameleon8010 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 29/04/2010, 14h04
  3. Réponses: 3
    Dernier message: 27/11/2008, 17h57
  4. Impossible de rediriger vers une page après un délai
    Par Gouyon dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 07/11/2008, 09h24
  5. Rediriger vers une page après sélection dans un select
    Par belzeluc dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 07/11/2006, 22h32

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