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

Tomcat et TomEE Java Discussion :

Simuler authentification Realm


Sujet :

Tomcat et TomEE Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 24
    Par défaut Simuler authentification Realm
    Bonjour,

    J'ai un portail web dont le contrôle d'accès est délégué à un JDBCRealm avec un formulaire. Tout va bien de ce côté

    Mais j'ai besoin d'accéder depuis un robot Java à une des pages protégées de ce portail. Donc, dans ce robot, j'essaye de m'authentifier auprès des Realm pour pouvoir ensuite accéder proprement à ma page. Voici l'algo que j'ai mis en oeuvre :
    1) appel URL souhaitée
    2) comme prévue, le Realm me renvoie d'abord le formulaire de login
    3) j'extrais de cette réponse la JSESSIONID depuis le cookie (en-tête)
    4) j'appelle à présent le j_security_check pour simuler le POST du formulaire d'authentification.

    Et j'obtiens une erreur HTTP 408 de la part du serveur comme s'il y avait un timeout de connection !

    Pourtant dans le POST :
    - je set bien sûr les données du formulaire (j_username et j_password)
    - ainsi que des en-têtes. J'ai vérifié avec wireshark que mes en-têtes matchaient vraiment celles envoyées par un browser lors du POST du vrai formulaire

    Quelqu'un a-t-il déjà réussi à simuler un POST d'un formulaire j_security_check ?

    Merci de votre aide pour ce problème ... pas simple

    Sylvain Caillet

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    le 408 arrive en cas de timeout de la session. En pratique, ca arrive quand le JSESSIONID fournis pas le client n'est pas dans la liste des sessions de tomcat.
    Es-tu sur d'avoir bien extrait la session? Préserve-tu les cookies du serveur dans ton client java? Un peu de code serait utile

  3. #3
    Membre averti
    Inscrit en
    Août 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 24
    Par défaut
    Bonjour tchize_,

    Merci de ta réponse. En fait, le process d'authentification est exécuté par un Daemon Java qui tourne sur un serveur, donc pas question de browser. C bien pour ça que je dois reproduire le mécanisme des realm.

    Voici mon 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
     
    	// We want to load the home page (after login page)
    	URL url = new URL("http://xxx.yyy.com/web/index.do");
    	HttpURLConnection connection = null;
            String JSESSIONID = null;
            try {
            	connection = (HttpURLConnection) url.openConnection();
            	connection.connect();
     
        		// flush the output
            	flushOutput(connection.getInputStream(), false);
     
            	// extract the JSESSIONID from the "Set-Cookie" header
                	String cookies = connection.getHeaderField("Set-Cookie");
               	String[] partsCookies = cookies.split(";");
               	for (String part : partsCookies) {
                		if (part.contains("JSESSIONID")) {
                			String[] subparts = part.split("=");
                			JSESSIONID = subparts[1];
                			break;
                		}
                	}
     
    	} catch (IOException e) {
    		e.printStackTrace();
    	}
     
    	// Post Realm form
    	String urlJCheck = "http://xxx.yyy.com/web/j_security_check";
    	URL checkUrl = new URL(urlJCheck);
            try {
            	// open connection
            	connection = (HttpURLConnection) checkUrl.openConnection();
            	connection.setRequestMethod("POST");
            	connection.setDoInput(true);
            	connection.setDoOutput(true);
            	connection.setInstanceFollowRedirects(false);
            	connection.setUseCaches(false);
     
                	// add headers
                	Map<String, String> h = new LinkedHashMap<String, String>();
                	h.put("REFERER", url.toExternalForm());
                	// I have tried with or without the "; Path=/web" part
                	h.put("Set-Cookie", "JSESSIONID=" + JSESSIONID + "; Path=/web");
               	// I have tried with or without all the following headers (in comment or not)
    		h.put("Content-Type", "application/x-www-form-urlencoded");
               	h.put("Connection", "keep-alive");
                	h.put("Keep-Alive", "300");
                	h.put("Host", "monitoring.alaloop.com");
    //            h.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    //            h.put("Accept-Language", "fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3");
    //            h.put("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
    //            h.put("Accept-Encoding", "gzip,deflate");
    //            h.put("User-Agent", "Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.1.5) Gecko/20091109 Ubuntu/9.10 (karmic) Firefox/3.5.5");
    		for (String key : h.keySet()) {
    			connection.addRequestProperty(key, h.get(key));
    		}
     
    		// Prepare parameters for Realm authenticate
    		StringBuilder parameter = new StringBuilder();
    					parameter.append("j_username").append("=").append(URLEncoder.encode("Administrator", "UTF-8"));
    		parameter.append("&");
    		parameter.append("j_password").append("=").append(URLEncoder.encode("xxxxxxxx", "UTF-8"));
     
    		// Post parameters
    		OutputStream os = connection.getOutputStream();
    		os.write(parameter.toString().getBytes("UTF-8"));
    		os.flush();
     
    		connection.connect();
     
        		// flush the output
            	flushOutput(connection.getInputStream(), true);
     
    	} catch (IOException e) {
    		e.printStackTrace();
    	} finally {
    		if (connection!=null)
    			connection.disconnect();
    	}
    Merci de ton aide !

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    il manque:

    dans ta deuxième url: ";JSESSIONID=......"

    Dans le premier code, je ne suis pas sur à 100% (à confirmer) que le serveur va envoyer immédiatement le cookie. Le processus pour déterminer si le client supporte les cookies, de mémoire, nécessite 3 requetes dans tomcat. Donc tu risque de devoir extraire le JSESSIONID depuis le contenu de la page.

  5. #5
    Membre averti
    Inscrit en
    Août 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 24
    Par défaut
    dans ta deuxième url: ";JSESSIONID=......"
    Pour écrire cette simulation, je me suis appuyé sur les échanges HTTP interceptés par Wireshark de manière à (essayer !) reproduire le même mécanisme. Or je n'ai pas vu de passage de session par l'url lorsqu'on se connecte depuis le navigateur. Mais après essai, ça ne fonctionne pas non plus.

    Dans le premier code, je ne suis pas sur à 100% (à confirmer) que le serveur va envoyer immédiatement le cookie. Le processus pour déterminer si le client supporte les cookies, de mémoire, nécessite 3 requetes dans tomcat. Donc tu risque de devoir extraire le JSESSIONID depuis le contenu de la page.
    En tout cas, ce code me fournit toujours une session (qui a l'air) valide dans le cookie. Et comme précédemment, wireshark ne m'a pas montré trace de ces allers-retours.

    Pour info, les traces HTTP des échanges Browser / serveur sont les suivantes :
    query : HTTP GET /web/index.do
    response : HTTP 200 (en fait le formulaire de login)
    query : HTTP POST /web/j_security_check
    response : HTTP 302 (moved temporarly)
    query : HTTP GET /web/index.do
    response : HTTP 200 (cette fois la bonne page)

    et avec mon code, le 302 est remplacé par le 408.

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    bizzare, enfin ca dépend de la version de tomcat je suppose. As-tu essayé avec commons http client? Il est plus apte a gérer correctement les redirect et les sessions automatiquement....

  7. #7
    Membre averti
    Inscrit en
    Août 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 24
    Par défaut
    Ok, merci quand même ! Je vais essayer avec cette API pour voir si c mieux.

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

Discussions similaires

  1. authentification realm jdbc
    Par kokumbo dans le forum Glassfish et Payara
    Réponses: 0
    Dernier message: 15/02/2010, 12h54
  2. Réponses: 3
    Dernier message: 24/08/2009, 17h47
  3. authentification realm + ldap
    Par cybernatus dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 04/08/2006, 09h43
  4. authentification realm / tomcat /jboss
    Par cybernatus dans le forum Wildfly/JBoss
    Réponses: 1
    Dernier message: 02/08/2006, 18h14
  5. [Authentification Realm] Infos utilisateur et redirection
    Par mamiberkof dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 22/04/2006, 22h16

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