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

AWT/Swing Java Discussion :

[Swing][Thread] Authentifier proprement un utilisateur


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut [Swing][Thread] Authentifier proprement un utilisateur
    Bonjour,
    J'ai une petite question :

    Actuellement j'ai une classe principale: MonApplication. Lorsqu'elle s'exécute, elle :
    1° : teste la connexion au SGBD
    2° : Affiche une fenêtre de login et attend.
    2° - 1 : La fenêtre de login à une action qui tente d'authentifier le couple login & password.
    2° - 2 : Si l'authentification est réussie, elle réveille le Thread de MonApplication.

    Pour cela, je passe à la fenêtre de login une référence vers MonApplication qui implémente Runnable. Mais je ne trouve pas cela trés propre...

    Avez-vous une autre solution ?


    LoginFrame
    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
     
    public class LoginFrame extends JFrame { 
      private Runnable mainThread; 
     
      public LoginFrame(Runnable mainThread) { 
        super(); 
        initialize(); // Place le contenu etc.. 
        this.mainThread = mainThread; 
      } 
     
      private JButton getBtn_enter() { 
        ... 
        btn_enter.addActionListener(new ActionListener(){ 
          User user = 
             User.authentifie(in_username.getText(), in_password.getPassword());  
     
          if ( user.isAuth() ){ 
            ((MonApplication) mainThread).setUser(user); 
            frame.dispose(); 
          } 
        } 
      } 
     
    }
    MonApplication
    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
     
    public class MonApplication implements Runnable{ 
     
      private static User user; 
     
      public void run() { 
        loginFrame = new LoginFrame(this); 
        loginFrame.setVisible(true); 
        try { 
          while(user==null) 
            wait(); 
        } catch (InterruptedException e) { 
          e.printStackTrace(); 
        } 
      } 
     
      public synchronized void setUser(User user){ 
        MonApplication.user = user; 
        notify(); 
      } 
     
    }
    Et pour ce qui est de l'authentification proprement dite, moi je me contente d'une simple requête "SELECT * FROM Users WHERE Login=.. AND Password=..."

    Mais il y à javax.security.auth.login aussi ..

    Je voudrais vraiment faire ça correctement, histoire de pouvoir le réutiliser dans d'autres applications mais je suis perdu et n'ai pas beaucoups d'idées sur la manière de le faire.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Ou vais-je bien pouvoir trouver une réponse si personne sur Developpez.com ne sais m'aider ??

  3. #3
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bonjour,

    Je ne vois qu'une autre solution : utiliser 2 threads (en plus de l'edt) :
    - le premier, le thread main, construit la LoginFrame et se termine (au lieu d'attendre comme dans ton cas)
    - dans l'actionListener, on crée un thread (toi tu réveillais le thread main) qui :
    - vérifie le login et le mot de passe (comme ça tu libères l'edt)
    - si ils sont invalides, il termine
    - si ils sont valides, détruit la LoginFrame et construit l'application

    Je ne suis pas sûr de ce que j'avance, mais il me semble que là, si tu fermes la LoginFrame, le programme ne va pas forcément s'arrêter (les threads ne sont pas tous terminés).
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Oui, ok merci c'est bien gentil mais ça me pose toujours quelques problèmes :

    * Le second Thread se ferme si le login et password sont invalides :
    Peuit-être plutôt le faire boucler sur n tentatives avant de quitter..

    * En fait au lancement, mon application affiche un SplashScreen qui indique les opérations :
    - Préparation et tes de sconnexions
    - Connexion aux serevurs
    - Identification de l'utilisateur.
    -> Attente du login
    - Suite...

    Donc le fait de terminer le Premier Thread me pose problème. (d'ou l'idée de le reveiller)
    Mais je doute sur le bien fondé de tout ça..
    - d'abord le splash puis l'identification puis la suite..
    OU
    - d'abord l'identification puis la suite..

    Pour terminer les threads, je m'arrangerais..

  5. #5
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Je ne suis pas sûr de te comprendre. En plus de tes 2 threads, il y a l'edt qui maintiendra les composants visibles, et qui s'occupera de gérer les clics/remplissages.

    Je te propose de n'utiliser des threads que pour construire et détruire les composants graphiques. Tout le reste se fera dans des listeners, donc dans l'edt (event dispatch thread).

    Avec un splash, je vois les choses comme ça :
    - thread1 construit le splash, et fait ce qu'il y a à faire (chargement, évolution de la ProgressBar, ...) et construit la loginFrame
    - thread2, vérifie le login et mot de passe. Si ils sont invalides, il termine, et la fenêtre de login est toujours visible. Il sera recréé à chaque tentative de login et password.
    - si ils sont valides, il dispose la fenêtre de login, et prend la suite du chargement (avec gestion du splash et de la ProgressBar).

    Ceci n'interdit pas d'essayer n fois de se loguer, puisqu'en cas d'erreur, la fenêtre de login n'est pas fermée. Ca permet aussi de mettre les champs d'authentification dans le splashscreen si tu trouves ça mieux.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Oui, justement, c'est ce que je fais..
    Mon application implémente Runnable (c'est donc le Thread1).
    dans run() elle ouvre le splash screen ensuite commence à changer l'état du spalsh et gérer le progressBar. Jusqu'a la création/affichage de la loginFrame. mais ensuite elle continue...

    Alors que tant que l'utilisateur n'est pas identifié, elle doit rester en attente carle reste du chargement se fait ne partie à partir des infos utilisateurs...

    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
     
    public class MonApp implements Runnable {
     
      ...
     
      public void run() {
        SplashScreen splashScreen = new SplashScreen();
        splashScreen.setAction(SplashScreen.ACTION_INITALIZE);
     
        splashScreen.setAction(SplashScreen.ACTION_CONNECTING);
     
        splashScreen.setAction(SplashScreen.ACTION_AUTHENTIFICATION);
        LoginFrame2 loginFrame = new LoginFrame2();
        loginFrame.setVisible(true);
     
        System.out.println("suite...");
      }
     
     
      public static void main(String args[]) {
        MonApp monApp = new MonApp();
     
        SwingUtilities.invokeLater( monApp );
      }
    }
    Citation Envoyé par Execution
    Affiche le splaschscreen
    change l'action du splaschscreen pour "initialize"
    change l'action du splaschscreen pour "connecting"
    change l'action du splaschscreen pour "authentification" et affiche loginFrame
    affiche "suite.." dans la console..
    Edit : j'ai vraiment de gros problèmes ou grosses lacunes avec les Threads. En plus de ceci :
    * http://java.sun.com/docs/books/tutor...c/threads.html
    * http://java.sun.com/developer/techni...Threads/swing/
    Que me conseillerais-tu ?
    Dernière modification par Invité ; 14/09/2006 à 15h20.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par xavlours
    Avec un splash, je vois les choses comme ça :
    - thread1 construit le splash, et fait ce qu'il y a à faire (chargement, évolution de la ProgressBar, ...) et construit la loginFrame
    - thread2, vérifie le login et mot de passe. Si ils sont invalides, il termine, et la fenêtre de login est toujours visible. Il sera recréé à chaque tentative de login et password.
    - si ils sont valides, il dispose la fenêtre de login, et prend la suite du chargement (avec gestion du splash et de la ProgressBar).
    Ok,
    Donc monApplication exécuteras le Thread1 au démarrage jusqu'a l'écran de login. Ensuite Thread1 se ferme et plus rien en se passe tant que l'action de login n'a pas été déclenchée.

    Lorsque l'action de login est déclenchée, j'instancie Thread2 qui vas vérifier la validité du login et mot de passe.
    -> Si l'identifiaction échoue il s'arrête
    -> Si l'identifaction réussi, il dispose loginFrame et continue le chargement

    j'ai compris (enfin je crois) Merci.

    Pff il aura fallu du temps.

Discussions similaires

  1. [Swing & Threads] Ralentissements
    Par HunTR dans le forum EDT/SwingWorker
    Réponses: 9
    Dernier message: 02/04/2010, 10h01
  2. [Swing][Thread] affichage fenetre pdt tache longue
    Par rems033 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 09/08/2007, 14h39
  3. Réponses: 11
    Dernier message: 04/08/2006, 11h07
  4. [SWING][THREAD]Méthodes pour afficher une Frame
    Par pompidouwa dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 05/05/2004, 10h35

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