Se connecter avec
S'enregistrer | Connectez-vous

Comparer un jpassword a un champ de table

Dernière réponse : dans Programmation

bonjour à tous,je voudrais dans ma requête select comparer la valeur d'un champ de saisie de type jpasswordfield a la valeur se trouvant dans ma table,mais il y'a un problème.voici ma requête en question:
login est un JTexfield
pass correspond au JPasswordField
CodeAcces_Opt et MotPasse_Opt correspondent aux champs de la table

  1. "select * from Operateur where CodeAcces_Opt ='"+login.getText()+"' and MotPasse_Opt = '"+pass.getPassword+"'";

Quand je coupe ma requete je veux dire sans impliquer le mot de passe ça marche du genre :

  1. "select * from Operateur where CodeAcces_Opt ='"+login.getText()+"'";


Donc le probleme doit se situer dans l’obtention de la valeur du mot de passe a l’aide.
Aussi j’aimerais qu’à l’execution se soit mon formulaire de connexion qui s’affiche en premier,je ne sais pas comment le faire quelqu’un pourrait-il m’aider ?

Autres pages sur : comparer jpassword champ table

Lassé par la pub ? Créez un compte
Expert Programmation

Bonjour,

Il manque quelques informations pour qu'on puisse t'aider !

  • Quel est ton SGBD ? (MySQL, PosgreSQL, Oracle, Accès, ...)
  • Que contient ta base ? (fais un screenshot, listing, ...)
  • Qu'elles sont les résultats des requêtes ? (directement dans la base, et à partir du code)

    Dans tous les cas, la première requête n'est pas très représentative. Tu souhaites savoir si l'identifiant et le mot de passe corresponde, donc un "select count(*)" me semble plus approprié. (tu auras le nombre d'occurence du login+password)

    De plus, vérifie que tes "mots de passes" ne soient pas crypté (MD5, ou autres)... Du coup, tester un "pass" en clair sur un crypté ne sera jamais valide.

    Bon courage pour la suite.
    Expert Programmation

    Salut,

    Vu que getPassword est une méthode (visiblement), il faudrait plutôt faire getPassword() que getPassword, non ?
    Et puis, getPassword() retourne un tableau de caractères (char[]) et pas une chaine de caractères (string).

    Il faudrait alors faire:
    1. String password = new String(passwordField.getPassword());


    Sauf que la documentation indique de ne pas traiter les passwords en tant que chaine de caractères.


    Edit: aussi, il faut plutôt utiliser des requêtes avec des paramètres, plutôt que de mettre directement des chaines de caractères pour éviter les SQL injections.

    Merci bien pour votre aide j'ai pu resoudre le problème,il me reste un second souci,je voudrais qu'à l'exécution de mon application,le formulaire de connexion soit la page d'accueil en fait j'ai crée un menu a partir duquel je choisi les différentes taches,dans ma methode main() j'appelle le menu :


    1. menu mn=new menu();
    2. mn.setVisible(true);

    dans mon formulaire de connexion egalement j'appele le menu apres authentification:

    1. if(resultats.next())
    2. {
    3. JOptionPane.showMessageDialog(null," Anso Vous etes connecté","Succès d'authenication",JOptionPane.ERROR_MESSAGE);
    4. menu mn = new menu();
    5. mn.setVisible(true);
    6. }
    7. else
    8. JOptionPane.showMessageDialog(null,"Echec connexion","Erreur d'authenication",JOptionPane.ERROR_MESSAGE);


    mais je ne sais comment a faire de mon formulaire de connexion mon formulaire d'accueil.aidez moi merci,j'utilise mysql et netbeans 6.8 comme IDE os XP pro
    Expert Programmation

    Bonjour,

    Comme le disait OmaR, il serait bon de faire tes tests avec des requêtes paramétrées.

    Je vais te faire une petite démo (pas forcément fonctionnel) avec ton formulaire de connection au début :

    Le "Main":
    1. public class MonAppli
    2. {
    3. public static void main(String args[])
    4. {
    5. Runnable doCreateAndShowGUI = new Runnable()
    6. {
    7. @Override
    8. public void run()
    9. {
    10. FormBD.getInstance();
    11. }
    12. };
    13. SwingUtilities.invokeLater(doCreateAndShowGUI);
    14. }
    15. }


    Le formulaire:
    1. public class FormBD extends JFrame
    2. {
    3. private static FormBD instance;
    4. public static FormBD getInstance()
    5. {
    6. if(instance == null)
    7. instance = new FormBD();
    8. return instance;
    9. }
    10.  
    11. private JTextField jtf_login = new JTextField();
    12. private JPasswordField jpf_password = new JPasswordField();
    13.  
    14. private FormBD()
    15. {
    16. // ... Creer Frame et JPanel, puis setContentPane() et setVisibile
    17. // etc.
    18. }
    19.  
    20. public void actionPerformed(ActionEvent e)
    21. {
    22. // action du bouton OK pour la connection
    23. (new CheckValidityWorker(this)).execute();
    24. }
    25.  
    26. public String getLogin()
    27. {
    28. String login = jtf_login.getText();
    29. // ajouter vérif' pour éviter l'injection SQL ...
    30. return login;
    31. }
    32.  
    33. public String getPassword()
    34. {
    35. String password = new String(this.jpf_password.getPassword());
    36. // ajouter vérif' pour éviter l'injection SQL ...
    37. return password;
    38. }
    39.  
    40. class CheckValidityWorker extends SwingWorker<Boolean, Object>
    41. {
    42. private static final String sql = "SELECT count(*) AS EXIST FORM Operateur WHERE CodeAcces_Opt = ? AND MotPasse_Opt = ?";
    43. private Connection connexion;
    44. private PreparedStatement preparedStatement;
    45. private FormBD formulaire;
    46.  
    47. public CheckValidityWorker(FormBD fbd)
    48. {
    49. this.formulaire = fbd;
    50. this.connexion = DriverManager.getConnection("jdbc:mysql://IP_BASE_DE_DONNEES:PORT_BASE_DE_DONNEES/BASE","login", "passe");
    51. }
    52.  
    53. @Override
    54. public Boolean doInBackground()
    55. {
    56. Boolean result = Boolean.FALSE;
    57.  
    58. try
    59. {
    60. this.preparedStatement = connection.prepareStatement(sql);
    61. this.preparedStatement.setStringl(1, this.formulaire.getLogin() );
    62. this.preparedStatement.setStringl(2, this.formulaire.getPassword() );
    63. if(this.preparedStatement.execute())
    64. {
    65. ResultSet rs = statement.getResultSet();
    66. if(rs.next())
    67. if( rs.getInt("EXIST") == 1 )
    68. result = Boolean.TRUE;
    69. }
    70. rs.close();
    71. this.preparedStatement.close();
    72. } catch(Excepion e)
    73. {
    74. e.printStackTrace();
    75. }
    76.  
    77. return result;
    78. }
    79.  
    80. @Override
    81. protected void done()
    82. {
    83. try
    84. {
    85. /*
    86. * À la fin du traitement, récupération de l'état de connection
    87. */
    88. if( this.get() )
    89. {
    90. JOptionPane.showMessageDialog(this.formulaire, "Anso Vous etes connecté","Succès d'authenication");
    91. this.formulaire.setVisible(false);
    92. MainFrame.getInstance();
    93. } else
    94. {
    95. JOptionPane.showMessageDialog(this.formulaire,"Echec connexion","Erreur d'authenication",JOptionPane.ERROR_MESSAGE);
    96. }
    97. } catch (Exception e)
    98. {
    99. e.printStackTrace();
    100. }
    101. }
    102. }
    103. }


    La fenêtre principal de ton application (après identification):
    1. public class MainFrame extends JFrame
    2. {
    3. private static MainFrame instance;
    4. public static MainFrame getInstance()
    5. {
    6. if(instance == null)
    7. instance = new MainFrame();
    8. return instance;
    9. }
    10.  
    11. private MainFrame()
    12. {
    13. // ... Creer Frame et JPanel, puis setContentPane() et setVisibile
    14. // etc.
    15. }
    16. }


    Un truc du genre devrait avoir le comportement que tu recherches ...
    Bon courage.

    Bonjour je reviens de nouveau vers vous,je n’arrive pas à comprendre une partie du code que vous m’avez proposé : c’est celui là :
    1. public void actionPerformed(ActionEvent e)
    2. {
    3. // action du bouton OK pour la connection
    4. (new CheckValidityWorker(this)).execute();
    5. }

    Je crois, enfin, c’est que je me dis, que c’est cette action qui est implémentée dans cette classe là:
    1. class CheckValidityWorker extends SwingWorker<Boolean, Object>
    2. {
    3. private static final String sql = "SELECT count(*) AS EXIST FORM Operateur WHERE CodeAcces_Opt = ? AND MotPasse_Opt = ?";
    4. private Connection connexion;
    5. private PreparedStatement preparedStatement;
    6. private FormBD formulaire;
    7.  
    8. public CheckValidityWorker(FormBD fbd)
    9. {
    10. this.formulaire = fbd;
    11. this.connexion = DriverManager.getConnection("jdbc:mysql://IP_BASE_DE_DONNEES:PORT_BASE_DE_DONNEES/BASE","login", "passe" );
    12. }

    Ou dois-je de nouveau l’implémentée ?l’idée est qu’après saisie des différents champs « code d’accès et mot de passe » un clique sur le bouton connexion, dans le cas ou l’authentification s’est bien passé doit ouvrir un formulaire menu, autrement un message d’erreur est affiché et j’ai l’impression que s’est ce qui est fait dans la classe.merci
    Expert Programmation

    Bonsoir,

    Si tu ne connais pas le "SwingWorker" je te conseil de faire quelques recherches sur Google... Il s'agit d'un outil très utile (en rapport avec tout ce qui est Thread, EDT, etc.)

    Donc le "execute" de l'action démarre un thread qui fait les action du "doInBackground".

    Ce dernier, une foi terminé, retourne un objet (dont le type est défini dans la généricité, ici Boolean).

    Une fois ce thread terminé, la fonction "done" est envoyé au Thread graphique EDT. C'est lui qui va afficher ce que tu veux.

    Il récupère le résultat de la fonction "doInBackground" grâce à la fonction "get".


    Normalement, avec un peu de recherche sur google, tu comprendras l'intérêt du SwingWorker et le pourquoi de son utilisation.

    Bonjour à tous je n’arrive pas à afficher la valeur issue d’une table dans un combobox,en ce qui concerne lesjtexfields aucun souci,voici mon code :

    String rq = "select * from Compte";
    rs = st.executeQuery(rq);
    //while (rs.next()) {
    if (evt.getSource() == cmdpremier) {
    rs.first();


    nom.setText(rs.getString("NomClt")) ;
    prenom.setText(rs.getString("PrenomClt"));
    solde.setText(rs.getString("SoldeCpt"));
    typcpte.setSelectedItem("TypeCpt");
    typpiece.setSelectedItem(this); //typpiece correspond au nom du JComboBox
    numerocpte.setText(rs.getString("NumCpte"));
    numpiece.setText(rs.getString("NumPiece"));
    jour.setSelectedItem((DatPiece)); // idem pour jour
    mois.setSelectedItem(this); //ainsi que mois
    annee.setSelectedItem(this); // annee également
    datouv.setText(rs.getString("datouv"));
    en remplaçant la clause this par le nom de la colonne le système dit ne pas le connaitre.
    Expert Programmation

    How to Use Combo boxes < à lire !

    Si il ne trouve pas le nom que tu spécifies, cela signifie qu'il n'est pas dans le model du ComboBox !

    Vérifies ton initialisation de "typpiece" ! Si tu l'instancies (new) avec un tableau de String, vérifies que tu l'écris bien de la même façon partout ...

    j'ai regarder dans le lien que vous m'avez donné mais j'ai toujours le meme probleme,
    soit datouv le name de mon Jcombobox
    DatOuv le nom de la colonne de la table
    logiquement quand je fais:
    datouv.setText(rs.getString("DatOuv" )); je doit avoir la valeur dans le JComboBox n'est ce pas?mais c'est pas le cas.ou je m'y prends mal?
    Expert Programmation

    Si "DatOuv" est un JComboBox, alors il faut utiliser :

    1. datouv.addItem( rs.getString("DatOuv") );


    Mais il faut t'assurer, lors du "setSelected" que la chaîne que tu souhaites sélectionner soit bien présente dans le ComboBox (try catch si tu veux pas te faire chier).

    bonjour,mon souci d'affichage de données dans mon JCombobox persiste ,quand je fais [datouv.addItem( rs.getString("DatOuv" ) );]il ajoute une valeur dans mon JComboX,ce n'est pas en fait ce que je veux,j'ai sauvegarder des données a travers un formulaire dans une de mes tables,ce formulaire en question comporte des JcomboBox que l'utilisateur déroule et choisi une valeur qui sera enregistrée dans la table,maintenant pour l'affichage,en fait une consultation des enregistrements je souhaiterai non pas ajouter cette valeur choisie par l'utilisateur au JcomboBox,mais afficher la valeur qu'il à choisi lors de la sauvegarde,que cette valeur pour cet enregistrement soit affichée en fait dans le jcombobox.je ne sais pas si je me fais comprendre?je faisais datouv.setSelectedItem((DatOuv));mais je constatait que c'etait la valeur par defaut du Jcombobox qui restait.
    Expert Programmation

    Assure toi que la chaîne dans la table est juste ... Il faudrait pas essayer de sélectionner "toto" quand celui-ci n'existe pas dans le model !

    1. try {
    2. typcpte.setSelectedItem( rs.getString("TypeCpte" ) );
    3. } catch(Exception e) {
    4. typcpte.setSelectedIndex( 0 );
    5. }
    Lassé par la pub ? Créez un compte
    Tom's guide dans le monde