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 Sécurité avec GWT : Sécuriser les servlets


Sujet :

GWT et Vaadin Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 173
    Points
    173
    Par défaut [ Résolu ] Authentification Sécurité avec GWT : Sécuriser les servlets
    Bonjour,

    je suis actuellement à la recherche d'une solution de sécurisation d'un appli GWT.
    CE qui est sur, c'est que je veux utiliser seulement GWT (pas d'ACEGI / Spring Security, etc...)

    Comme base j'ai cet article de Google (un tantinet laconique) :
    http://code.google.com/p/google-web-...ginSecurityFAQ

    En premier, est ce que quel qu'un peut m'indiquer comment se traduit en code cette phrase :

    Your server will then validate this login, and return a sessionID to your GWT app. The GWT app will store this sessionID in a static field. For every further request your GWT app makes to your server, include this sessionID in the payload of the request. (Either in the JSON data or the object you are transferring using GWT-RPC).
    Je suppose que je mets l'Id de session dans l'appController au lancement et ensuite je fais quoi? Je le mets en paramètre de chaque appel GWTrpc?

    Sinon je pensais faire une "SecurityServlet" côté serveur qui vérifie si il y a le paramètre "sessionId" dans la session et qui le compare avec le sessionId actuel.

    Vous avez des idées?

  2. #2
    Membre averti
    Profil pro
    Lead Tech Agile
    Inscrit en
    Septembre 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Points : 417
    Points
    417
    Par défaut
    Si tu n'as rien d'autre que GWT je ferais.

    1 - l'utilisateur se connecte à l'appli, il récupère donc le html qui n'a pas de sessionId et qui va donc afficher l'écran de login.
    2 - il se log, côté serveur tu vérifie que son login / MDP sont correcte, tu génère un sessionId et tu le renvois en réponse et que tu garde côté serveur.
    3 - Côté client tu stocke le sessionId en cookie. le cookie est transmis à chaque requete. Côté serveur tu dois pouvoir le récupérer pour vérifier à chaque appel si ton user est bien connecté.

    Cas d'exception :
    Si l'appel Rpc à un sessionId incorrect, tu renvoie une exception. Côté GWt si tu récupère l'exception tu affiche la page de login.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 173
    Points
    173
    Par défaut
    J'ai un souci du coup, je ne peux pas partager de données dans la session avec GWT.

    Je me suis inspiré de cet article :
    http://developerlife.com/tutorials/?p=230

    dont la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	/**
             * Returns the current session
             * @return The current Session
             */
    	private HttpSession getSession() {
    		// Get the current request and then return its session
    		HttpServletRequest httpServletRequest = getThreadLocalRequest();
    		HttpSession session = httpServletRequest.getSession();
    		return session;
    	}
    mais le httpServletRequest.getSession(); me renvoie un null pointer exception la deuxième fois que je l'utilise.

    Avec une servlet classique ça devrait être facile mais avec les remoteServiceSevlet de Google, impossible de trouver un moyen correct de procéder.

  4. #4
    Membre averti
    Profil pro
    Lead Tech Agile
    Inscrit en
    Septembre 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Points : 417
    Points
    417
    Par défaut
    Tu peux créer un filtre Http sur tes appels Rpc.

    Il sera appelé avant la méthode Gwt.

    Un exemple ici : http://www.berthou.com/fr/2009/01/11...tion-dune-jsp/

    Le mécanisme est le même avec des services Rpc.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 173
    Points
    173
    Par défaut
    oui mais je ne vois pas trop l'intérêt dans mon cas.
    Idéalement, j'aimerais ne pas avoir à stocker les infos dans une variables statique mais bien dans la session.
    Si je fais un filtre je suis obligé de passer par un tableau d'info statique.

  6. #6
    Membre averti
    Profil pro
    Lead Tech Agile
    Inscrit en
    Septembre 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Points : 417
    Points
    417
    Par défaut
    Au contraire, je pense que c'est la seule manière de réaliser une authentification.

    Avec ton filtre tu auras accès à la session Http. Il faut stocker les variables d'authentification dans la session Http. Ensuite, tu peux utiliser un ThreadLocal pour "envoyer" un identifiant vers le service Rpc.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 173
    Points
    173
    Par défaut
    J'ai déjà pensé aux filtres, le problème que j'ai rencontré c'est que les filtres ne fonctionnent pas avec les tags (page.html#toto) et ne permet pas d'exclure certaines urls. Du coup je vais me retrouver à faire une page login.jsp à part. Je pourrais le faire mais pour l'instant je cherche une alternative qui soit dans la même sorte que GWT.

  8. #8
    Membre averti
    Profil pro
    Lead Tech Agile
    Inscrit en
    Septembre 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Points : 417
    Points
    417
    Par défaut
    Citation Envoyé par kenji_getpowered Voir le message
    les filtres ne fonctionnent pas avec les tags (page.html#toto).
    C'est une ancre (ou anchor en anglais)

    --

    Si tu veux pas te prendre la tête avec des filtre Http (qui reste pour moi la meilleur soltution car non intrusive à l'appli) tu peux mettre en place un système intrusif qui va demander sur chaque appel Rpc une variable qui contiendra le sessionId. C'est pas tres propre mais ca marchera. C'est d'ailleur l'exemple de Google sur le premier lien que tu donnes ("Creating a 'login' page")

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 173
    Points
    173
    Par défaut
    Justement ils ne donnent pas d'exemple. Ils mentionnent une méthode mais ça en reste la. Chez moi j'ai un Null Pointer Exception sur ce que renvoie le getThreadLocalRequest. Si tu as un exemple, je suis preneur car j'ai vraiment cherché un peu partout.
    Je me demande si les sessions sont actives avec le plugin GWT for eclipse. Je ne vois plus ou chercher...

    Les filtres HTTP sont simples mais j'ai pas trouvé comment m'en servir avec GWT sans faire du bricolage (jsp externe, double filtre, etc...)

  10. #10
    Membre averti
    Profil pro
    Lead Tech Agile
    Inscrit en
    Septembre 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Points : 417
    Points
    417
    Par défaut
    J'ai déjà donné cet exemple sur le forum, si tu ne l'as pas vu il y a une partie de l'explication dans cet article : http://ultrafil.tuxfamily.org/index....te-applicative

    Tu peux voir que j'ai utiliser un filtre http sur l'url pattern /*.

    Dans mon exemple j'utilise un WebSSO que tu dois remplacer par un écran de login.

    Tu peux donc faire ton url-mapping uniquement sur tes services Rpc.

    --

    Disons que tu souhaite utiliser la méthode intrusive (sans filtre http)

    Dans ce cas c'est très simple. Tu fais un écran de login. Le serveur valide et renvoie un sessionId que tu stock en cache côté client avec un champ static.
    Ensuite toutes tes autres requetes Rpc vont prendre en argument ce sessionId que tu vérifie côté serveur.

    C'est pas très élégant mais tu peux commencer comme ca si vraiment tu es perdu.

    T'as besoin d'un exemple pour faire ca ?

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 173
    Points
    173
    Par défaut
    J'ai vu ton article la dessus. Cela me semblait plus simple de partir avec le partage de donnée par session. mais je vais peut être y revenir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ensuite toutes tes autres requetes Rpc vont prendre en argument ce sessionId que tu vérifie côté serveur.
    Coté serveur, il va se baser sur quoi? Je pensais passer par une variable de session mais j'ai un null pointer exception dès que j'essaie de la récupérer

    méthode commune aux 2 servlets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	/**
             * Returns the current session
             * @return The current Session
             */
     
    	private HttpSession getSession() {
    		// Get the current request and then return its session
    		return this.getThreadLocalRequest().getSession(true);
    	}
    Dans la permière servlet, pas de souci tout est bien enregistré. Dans la 2ème j'ai un null pointer exception getThreadLocalRequest()

  12. #12
    Membre averti
    Profil pro
    Lead Tech Agile
    Inscrit en
    Septembre 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Points : 417
    Points
    417
    Par défaut
    Tu utilise quoi pour dispatcher tes requetes ?

    perso j'utilisais http://code.google.com/p/gwtrpc-spring/ et j'ai remarqué que la session n'est pas utilisable dans le service Rpc. je pense que c'est un bug.

    Je n'ai jamais essayé directement avec GWT mais je ne serais pas étonné que ca fonctionne.

    Sinon en attendant de trouver comment utiliser la session tu peux toujours utiliser une variable static côté serveur. C'est pas génial mais ca marche.

    Tu te fais une HashMap que tu rempli au fur et a mesure et que tu n'oublie pas de vider de temps en temps. C'est ce que fais le serveur avec la session en fait mais là tu dois te retaper le mécanisme à la main.

    Je vais essayer ce soir et je te dirais demain si j'ai trouvé une solution élégante à ton prob.

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 173
    Points
    173
    Par défaut
    Je n'utilise pas de point d'entrée coté serveur. On y a pensé mais on a peu de servlet GWT donc on a pas senti le besoin d'en mettre un.

    On attaque les servlet directement comme indiqué dans l'exemple.

    J'ai pensé à la variable statique et j'ai testé. je vais peut t être m'orienter vers cela en attendant mais je préfèrerais utiliser une autre technique. Je vais tester le filtre mais sans AOP. En plus on a des servlet classiques donc ce serait éventuellement une bonne solution. Je fais ça demain... la je craque

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 173
    Points
    173
    Par défaut
    pour passer le sessionId dans un requete vers le service GWT j'ai trouvé ce 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
    // start with a custom RpcRequestBuilder
    RpcRequestBuilder reqBuilder = new RpcRequestBuilder() {
      @Override
      protected RequestBuilder doCreate(String serviceEntryPoint) {
        RequestBuilder rb = super.doCreate(serviceEntryPoint);
        rb.setHeader("username", "sookie_stackhouse");
        return rb;
      }
    };
     
    // as with any other RPC, use GWT.create(...) to generate the client proxy
    MyServiceAsync service = (MyServiceAsync) GWT.create(MyService.class);
     
    // all client proxies also implement ServiceDefTarget
    ((ServiceDefTarget) service).setRpcRequestBuilder(reqBuilder);
     
    // make calls as normal
    service.doFunAndInterestingThings();
    http://stuffthathappens.com/blog/200...-with-gwt-rpc/

    J'ai installé un filtre qui parse tous les appels vers les servlet sauf pour celle du login et du logon


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	public void doFilter(ServletRequest request, ServletResponse response,
    			FilterChain chain) throws IOException, ServletException {
    		// place your code here
    		HttpSession session = ((HttpServletRequest) request).getSession();
     
    		String login = (String) session.getAttribute("login");
    		logger.debug("doFilter - Login=" + login);
     
    		chain.doFilter(request, response);
    	}
    avec 2 pages jsp (login + logon) et la page gwt appli.html

    Je filtre en utilisant ce filtre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	<filter>
    		<filter-name>SecurityFilter</filter-name>
    		<filter-class>com.package.filters.SecurityFilter</filter-class>
    	</filter>
    	<filter-mapping>
    		<filter-name>SecurityFilter</filter-name>
    		<url-pattern>/appli*</url-pattern>
    	</filter-mapping>
    		<filter-mapping>
    		<filter-name>SecurityFilter</filter-name>
    		<url-pattern>/appli.html</url-pattern>
    	</filter-mapping>
    les servlets ont un point d'accès genre /appli/service sauf les login et logon qui sont en /acces/login et /access/logon. La page gwt est soumise au filtre de sécurité aussi mais pas les pages login.jsp et logon.jsp

    J'ai quand même le souci du partage de données en session car je n'arrive pas à accéder à la session en cours dans un RemoteServiceServlet.
    Comme j'ai sorti la page de login de GWT je ne peux pas mettre d'id coté client.

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 173
    Points
    173
    Par défaut
    Je me répons à moi même:

    Lorsque l'on veut accéder à la session en cours avec un RemoteServiceServlet il y a un petit point à prendre en compte :

    Il faut attendre que le 1er objet RemoteServiceServlet soir constuit avant de pouvoir accéder au getThreadLocalRequest() sinon vous obtiendrez un Null Pointer Exception.

    Ce qui pourrait vous induire en erreur :
    - SI vous avez déjà fait un appel à un RemoteServiceServlet alors vous pourrez faire appel au getThreadLocalRequest() dans le constructeur d'une 2ème servlet.
    - Même si vous avez déjà initialisé une session à l'aide par exemple (dans mon cas) d'une servlet classique (donc vous avez un sessionId et x paramètre(s)) vous obtiendrez un Null Pointer Exception si vous tentez d'accéder au getThreadLocalRequest() dans le constructeur du 1er appel d'une RemoteServiceServlet.

    En espérant que cela aide d'autres personnes.

    Du coup, maintenant j'ai ma solution de sécurité pour GWT. Toute remarque est bienvenue.

  16. #16
    Membre averti
    Profil pro
    Lead Tech Agile
    Inscrit en
    Septembre 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Points : 417
    Points
    417
    Par défaut
    Salut kenji,

    désolé je n'ai pas eu le temps de regarder chez moi ton prob.

    Je suis content que tu ai trouvé une solution.

    Avec ta solution tu es obligé d'utiliser ton requestBuilder à chaque appel Rpc ?

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 173
    Points
    173
    Par défaut
    Merci pour ton aide tout de même. Ca fait plaisir de pas se sentir tout seul

    J'utilise pas le RequestBuilder. Je mettais ça car je n'avais aucune idée de comment envoyer des infos dans le payload de la requête et la j'ai trouvé.

  18. #18
    Membre averti
    Profil pro
    Lead Tech Agile
    Inscrit en
    Septembre 2004
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Lead Tech Agile

    Informations forums :
    Inscription : Septembre 2004
    Messages : 316
    Points : 417
    Points
    417
    Par défaut
    Peux-tu donner le mécanisme de sécurité que tu as choisi et qui fonctionne maintenant ?

    Ca en aidera d'autres comme ca.

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 173
    Points
    173
    Par défaut
    C'est ce que j'ai décrit plus haut (avec 2 jsp et la page gwt etc..)

  20. #20
    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
    Points : 4 265
    Points
    4 265
    Par défaut
    J'aimerai bien voir le code de ta servlet si c'est possible car jamais eu de problème de session chez moi avec GWT et le mode RPC. Cela marche plutôt bien.

    Bien entendu, il faut bien comprendre comment marchent les servlets pour éviter le genre de problèmes que tu évoques.
    En résumé, dans les servlets :
    Eviter les variables d'instances (pb de synchro en env. multithread) et les constructeurs (c'est ton conteneur qui gère et pas toi)

    Tout le monde savait que c'était impossible. Il est venu un imbécile qui ne le savait pas et qui l'a fait. Marcel PAGNOL
    On ne savait pas que c'était impossible, alors on l'a fait. John Fitzgerald KENNEDY.
    L'inexpérience est ce qui permet à la jeunesse d'accomplir ce que la vieillesse sait impossible. Paul (Tristant) BERNARD
    La meilleure façon de prédire l'avenir, c'est de l'inventer.

Discussions similaires

  1. Problème avec NetBeans et les servlets
    Par HelloInfo dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 19/10/2012, 22h01
  2. affichage d'une image avec les servlets
    Par hassanovich dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 03/11/2006, 10h35
  3. Pb d'appel avec les servlets !
    Par anapotheque dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 21/06/2006, 10h19
  4. [SQL QUERY] Problème avec les servlet plutôt qu'avec SQL
    Par Battosaiii dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 11/04/2006, 01h08

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