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

GWT et Vaadin Java Discussion :

Authentification d'une application GWT avec CAS


Sujet :

GWT et Vaadin Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Par défaut Authentification d'une application GWT avec CAS
    Bonjour,

    Je suis actuellement en train de développer une application avec GWT et je me heurte à un problème d'authentification. Sur la plateforme où mon application GWT est déployée, un serveur d'authentification CAS et je voudrais utiliser cette authentification pour connecter les utilisateurs à mon application.

    Je suis donc allé sur ce site décrivant l'intégration dans un client Java :
    http://www.jasig.org/cas/client-integration/java-client

    J'ai ensuite modifié mon fichier web.xml pour ajouter le filtre de l'authentification CAS.
    <filter>
    <filter-name>CAS Filter</filter-name>
    <filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>
    <init-param>
    <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>
    <param-value>https://dev-cas/cas/login</param-value>
    </init-param>
    <init-param>
    <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
    <param-value>https://dev-cas/cas/serviceValidate</param-value>
    </init-param>
    <init-param>
    <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
    <param-value>localhost:8080</param-value>
    </init-param>
    </filter>

    <filter-mapping>
    <filter-name>CAS Filter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>

    <env-entry>
    <env-entry-name>AUTH_MODE</env-entry-name>
    <env-entry-value>CAS</env-entry-value>
    <env-entry-type>java.lang.String</env-entry-type>
    </env-entry>
    <env-entry>
    <env-entry-name>LOGOUT_PAGE</env-entry-name>
    <env-entry-value>https://dev-cas/cas/logout</env-entry-value>
    <env-entry-type>java.lang.String</env-entry-type>
    </env-entry>-->
    C'est maintenant que j'ai dû mal à savoir ce qu'il faut que je fasse pour valider les tickets renvoyés par mon serveur CAS. Est-ce qu'il faut que je définisse une méthode RPC permettant de valider le ticket (un peu comme dans l'exemple proposé sur le site Jasig) et qui est appelée dans la méthode onModuleLoad() de ma classe principale GWT?
    Ou bien, est-il préférable de définir une servlet vérifiant le ticket et qui est appelée une fois que l'utilisateur est authentifié? Cette méthode chargerait ensuite mon application GWT?

    Si quelqu'un a déjà mis en place ce type d'authentification avec GWT, je serais ravi de savoir comment il ou elle a procédé(e).

    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Par défaut
    Salut,

    J'ai déjà cassifié une application GWT.

    Je n'ai en revanche pas utilisé le CASFilter car dans mon cas, je pouvais envoyé l'utilisateur sur différents serveur CAS. Ma solution est la suivante :

    1) Le client fait une première requete http au serveur
    2) Le serveur http envoit au client le code html/js de mon application gwt.
    3) Dans le onModuleLoad(), j'appel une méthode de login côté serveur
    4) Cette méthode côte serveur se branche sur une interface AuthenticationService pour laquelle j'ai plusieurs authentification possible (CAS, LDAP, BDD, File, GAE, ...)
    5) Mon implémentation CASAuthenticationService (qui utilise la bibliothèque CasClient) vérifie s'il y a un ticket dans la requête.
    S'il n'y a pas de ticket, elle récupère en fonction de l'url de la requête le CAS approprié et renvoit au client GWT l'url de login du CAS (url du cas + url du service pour revenir à mon application)
    6) Le client GWT part donc sur le serveur CAS en modifiant l'url courante (voir comment faire cela ici)
    7) Le CAS permet d'authentifier l'utilisateur. Dès qu'il est authentifié, il revient sur mon application GWT grâce à l'URL de service fourni lors de son appel.
    8) L'application GWT repasse alors dans le onModuleLoad() qui rappelle le serveur et repasse donc dans mon CASAuthenticationService mais cette fois, il y a un ticket dans la requête ...
    9) CASAuthenticationService essaye de le valider. Si c'est ok, je récupere côté serveur le login du user et poursuit mon traitement. Si ce n'est pas ok, j'envoi une erreur à mon client GWT.


    Ca va, je t'ai pas perdu ?

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Par défaut
    Merci beaucoup pour ta réponse benwit! Je pense que ça va bien m'aider.

  4. #4
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Par défaut
    Salut benwit,

    Est-ce que je pourrais te déranger à nouveau à propos du CAS?

    Je pense que ce que j'essaie de faire se rapproche de ce que tu as fait pour ton application, à part que je n'ai qu'une seule façon de m'authentifier, avec le CAS.

    J'ai donc défini un CASFilter afin d'accéder à ma page de login CAS. Une fois authentifier, CAS me redirige vers l'url de mon service, à savoir mon application GWT.

    Dans ma méthode onModuleLoad(), je fais appel à une méthode asynchrone côté serveur qui doit valider le ticket reçu du serveur CAS.

    Le problème, c'est que j'ai une erreur au moment où je suis redirigé vers mon service. J'ai une erreur HTTP: ERROR 500 avec le message suivant :
    Unable to validate ProxyTicketValidator [[edu.yale.its.tp.cas.client.ProxyTicketValidator proxyList=[null] [edu.yale.its.tp.cas.client.ServiceTicketValidator casValidateUrl=[https://dev-cas/cas/serviceValidate] ticket=[ST-392-hQun1CKRddcmF9ysQlkWfTcUKQAzYexhEbP-20] service=[http%3A%2F%2Flocalhost%3A9000%2FProjetsRentree.html] renew=false]]]
    Ma méthode onModuleLoad() n'est même pas appelée, j'ai l'erreur avant même de faire appel à ma méthode de validation du ticket.

    Au niveau de mon serveur, j'ai le message d'erreur suivant :
    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1591)
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:187)
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:181)
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:975)
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:123)
    at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:516)
    at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:454)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1096)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1123)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1107)
    at sun.net.http://www.protocol.https.HttpsClien...lient.java:405)
    at sun.net.http://www.protocol.https.AbstractDe...ction.java:166)
    at sun.net.http://www.protocol.http.HttpURLConn...ction.java:977)
    at sun.net.http://www.protocol.https.HttpsURLCo...nImpl.java:234)
    at edu.yale.its.tp.cas.util.SecureURL.retrieve(SecureURL.java:84)
    at edu.yale.its.tp.cas.client.ServiceTicketValidator.validate(ServiceTicketValidator.java:212)
    at edu.yale.its.tp.cas.client.CASReceipt.getReceipt(CASReceipt.java:57)
    at edu.yale.its.tp.cas.client.filter.CASFilter.getAuthenticatedUser(CASFilter.java:455)
    at edu.yale.its.tp.cas.client.filter.CASFilter.doFilter(CASFilter.java:378)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1088)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:324)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:829)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:513)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
    L'erreur provient-elle du fait qu'il me manque le certificat de mon serveur CAS? Si c'est le cas, où est-ce que je dois le placer dans mon application?

    Est-ce qu'il ne vaut pas mieux que je créé une servlet à part uniquement pour la validation de mon ticket?

    Merci d'avance.

  5. #5
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Par défaut
    Je l'ai pas eu celle là !
    Je n'ai pas eu de problème de certificats.

    Tu devrais peut être utilisé une servlet à part, je pense que ça serait mieux. Il ne faut pas appliquer ton filtre à toutes les requêtes.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Par défaut
    Salut,

    J'aurais (encore) une question pour toi si ça te dérange pas.

    Dans ton implémentation de CAS, ta méthode côté serveur CASAuthenticationService vérifie s'il y a un ticket dans la requête HTTP. De mon côté, je n'arrive pas à récupérer le paramètre "ticket" de ma requête HTTP dans ma méthode côté serveur.

    Pour le récupérer, j'utilise le code suivant :
    HttpServletRequest request = getThreadLocalRequest();
    request.getParameter("ticket")
    Sauf que dans ma requête côté serveur, ce paramètre n'est pas présent. Il n'est présent que dans la requête lors du chargement du client. Du coup, est-il possible de récupérer un paramètre d'une requête HTTP dans la méthode onModuleLoad() de la partie client et de le transmettre à la méthode d'authentification côté serveur?
    Ou bien, il faut que je fasse différemment pour récupérer ce paramètre?

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

Discussions similaires

  1. Faire communiquer une application GWT avec une applet Java ?
    Par Beginner. dans le forum GWT et Vaadin
    Réponses: 1
    Dernier message: 08/02/2013, 21h16
  2. Test d'une application GWT avec JMeter
    Par passion_info dans le forum GWT et Vaadin
    Réponses: 1
    Dernier message: 21/09/2011, 15h08
  3. Réponses: 4
    Dernier message: 23/02/2010, 11h00
  4. Réponses: 2
    Dernier message: 23/03/2005, 21h58

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