0

ユーザーがユーザー名とパスワードを入力すると、入力がユーザーテーブルの行と一致するかどうかを確認して認証が行われるようにしたいと思います。これまでのコードは次のとおりです。データベース内の最初のユーザーのみがログインできます。正しく設定する方法を教えてください。ありがとう

private class thehandler implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent ae) {
        String namevalue = usertext.getText();
        String pwdvalue = pwdtext.getText();

        //read values from user table in sql database    
   try {
        Class.forName("com.mysql.jdbc.Driver");
        String conUrl = "jdbc:mysql://localhost/hall?" +
                               "user=root&password=blend";

        Connection con = DriverManager.getConnection(conUrl);
        Statement stmt = con.createStatement();

        ResultSet rs = stmt.executeQuery("SELECT * FROM user");

        while(rs.next()) {

            if(namevalue.equals(rs.getString("userName")) && pwdvalue.equals(rs.getString("password"))) {
            JOptionPane.showMessageDialog(null, "You are logged in", 
                    "Makhall login", JOptionPane.INFORMATION_MESSAGE);
            //move on to homepage if user is valid
            homePage home = new homePage();
            home.setAlwaysOnTop(rootPaneCheckingEnabled);
            }
            else {

            JOptionPane.showMessageDialog(null, "Incorrect username or password",
                    "Error", JOptionPane.ERROR_MESSAGE);
            }
            break;
        }
    }
    catch (SQLException e) {
        System.out.println("SQL Exception: "+ e.toString());
    } 
    catch (ClassNotFoundException cE) {
        System.out.println("Class Not Found Exception: "+ cE.toString());
    }

  }
}
4

3 に答える 3

3

申し訳ありませんが、これはひどいコードだと思います。UI、データベース接続、クエリなど、すべてが混ざり合っています。Javaはオブジェクト指向言語です。優れたオブジェクトデザインのテナントの1つは、結束です。クラスに1つのことをうまくやらせることです。

データベースクエリをデータアクセスオブジェクトに分割することから始めます。それを動作させ、テストし、他のクライアントに単純に使用させます。単純なオブジェクトを連携させることで、複雑なソリューションを構築します。

差し迫った問題は、SELECTにWHERE句が必要なことですWHERE username = ?

手元のユーザーのパスワードのみを確​​認する必要があります。

その疑問符は意図的なものです。StatementではなくPreparedStatementを使用してください。

于 2012-06-13T12:42:43.963 に答える
3

データベースからすべてのユーザーを選択しています。これは絶対にしないでください。代わりに、特定のログインを持つユーザーを選択します。存在する場合は、パスワードを確認してください。存在しない場合は、ログイン自体が正しくありません。

また:

  • データベース アクセス コードを UI コードから分離します。それらは別々のクラスにある必要があります。
  • 平文のパスワードをデータベースに保存しないでください。それらをソルトしてハッシュし、パスワードをチェックするには、パスワードをソルトしてハッシュし、データベースに保存されているソルトおよびハッシュされたパスワードと比較します。
于 2012-06-13T12:43:25.217 に答える
0

私も同じプログラムを作りました。ここを参照してください:

String m=jt1.getText();
String n= new String(jt2.getPassword());
try{        
           Connection con = DriverManager.getConnection("jdbc:mysql://localhost/darshanproject","root","");
           Statement st = con.createStatement();
           String q="select * from emp where UID='"+m+"'";
           ResultSet rs=st.executeQuery(q);
           rs.next();
           String user, pass;
           user =rs.getString("UID");
           pass =rs.getString("password");
           { if(m.compareTo(user)==0)
                 if(n.compareTo(pass)==0)
                     System.out.println("login Success");
                 else
                     System.out.println("Wrong Password");

           }
       }catch(Exception ex){
           System.out.println(ex);
       }
于 2015-10-25T16:31:26.677 に答える