0

データベースには 3 つのユーザー タイプがあります。 http://oi44.tinypic.com/2z8qflw.jpg

ログインフォームは こちら http://oi44.tinypic.com/20p5v04.jpg

ユーザータイプとして管理者を選択し、データベースからユーザー名とパスワードを入力すると、管理者フォームが表示されます。しかし、教師と生徒を選択し、データベースからユーザー名とパスを入力すると、無効な詳細である JOptionpane のみが表示されます。

ログインjframeのコードは次のとおりです。

JButton btnLogin = new JButton("Login");
btnLogin.setFont(new Font("Book Antiqua", Font.PLAIN, 18));
btnLogin.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent arg0) {
    String sql = "SELECT * FROM useRecords ";
    try {
      ps = conn.prepareStatement(sql);
      rs=ps.executeQuery();
      String user = usern.getText();
      String pwd = new String (passw.getPassword());
      String type =(String)typeUser.getSelectedItem();
      while(rs.next()) { 
        String uname = rs.getString("username");
        String pass = rs.getString("password");
        if ((user.equals(uname)) && (pwd.equals(pass))) { 
          if (type.equals("Admin")) {  // ... admin
            dispose();
            aCai aCai = new aCai();
            aCai.setVisible(true);
            aCai.setExtendedState(Frame.MAXIMIZED_BOTH);
          } else if (type.equals("Teacher")) {  // ... teacher
            dispose();
            tCai tCai = new tCai();
            tCai.setVisible(true);
            tCai.setExtendedState(Frame.MAXIMIZED_BOTH);
          } else {
            dispose();
            sCai sCai = new sCai();
            sCai.setVisible(true);
            sCai.setExtendedState(Frame.MAXIMIZED_BOTH);
          }
        } else {
          JOptionPane.showMessageDialog(null,  "User name and password do"
                                       + " not match!","ALERT!",
                                       JOptionPane.ERROR_MESSAGE); 
          break;
        }
      }
    } catch(Exception e) {
      JOptionPane.showMessageDialog(null, e);
    } finally {
      try{
        rs.close();
        ps.close();
      } catch(Exception e) {
      }
    }
  }
});
4

1 に答える 1

1

useRecord問題は、テーブルからすべての行を要求し、結果セットをループしていることです。最初の行でユーザー名またはパスワードの一致が見つからない場合はJOptionPanebreakループから抜けて、他の可能なチェックを防ぎます。

while(rs.next()) { 
        String uname = rs.getString("username");
        String pass = rs.getString("password");
        if ((user.equals(uname)) && (pwd.equals(pass))) { 
            //...
        } else {
          JOptionPane.showMessageDialog(null,  "User name and password do"
                                       + " not match!","ALERT!",
                                       JOptionPane.ERROR_MESSAGE); 
          break;
        }
}

より良いアプローチは、データベースにusernameandpasswordに直接一致するすべての結果を要求することです。たとえば...

String user = usern.getText();
String pwd = new String (passw.getPassword());
String type =(String)typeUser.getSelectedItem();
String sql = "SELECT * FROM useRecords where username=? and password=? and type = ?";
try {
    ps = conn.prepareStatement(sql);
    ps.bindString(1, user);
    ps.bindString(2, pwd);
    ps.bindString(3, type);
    rs=ps.executeQuery();

ps- 補足として、この方法でプレーン テキストを使用してパスワードを保存することは避ける必要があります (実際、パスワードを に保存することは避ける必要がありますString)。個人的には、ある種の一方向ハッシュ アルゴリズムを使用してパスワードをデータベースに保存します。このようにして、データベースが侵害された場合、パスワードを取得しても (多くの場合) 問題になりません - IMHO

于 2013-10-13T08:47:23.517 に答える