2014-02-27 36 views
0

如何在用戶登錄時驗證某個電子郵件和密碼?驗證電子郵件地址和密碼

protected void doPost(HttpServletRequest request, HttpServletResponse res) throws IOException, ServletException { 

    String email=request.getParameter("email"); 
    String pass=request.getParameter("pass"); 

    OutputStream out = res.getOutputStream(); 

    try{ 
      Class.forName("com.mysql.jdbc.Driver"); 
      Connection con = DriverManager.getConnection("jdbc:mysql://localhost:8080/college", "root", "root"); 
      Statement st=con.createStatement(); 
      String strSQL = "SELECT email,password FROM student"; 

如何在SELECT語句後繼續?我寧願使用if...else聲明來進行驗證。

+1

我想你應該首先解釋你的意思是「驗證」。這也會幫助你思考這個問題。 –

+0

我認爲這是更好地創建連接和初始化的OutputStream – Slimu

+3

我們不知道你的數據庫結構,但爲什麼不'SELECT COUNT(*)FROM學生WHERE電子郵件=前做驗證? AND密碼=?'。使用['PreparedStatement'](http://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html)。並且**不要在數據庫中以明文存儲密碼**。 –

回答

0

如果你願意,你可以使用。將輸入用作where語句,然後檢查是否存在匹配,錯誤或null,然後執行任何你想要的操作。

0

您可以在SQL語句本身中使用電子郵件和密碼。如:

SELECT email, password from student where email = ? and password = ? 

準備上述語句並綁定參數。

這種方法驗證將在數據庫上完成,您只需檢查結果計數(必須是1)。您應該在電子郵件列上有索引以獲得更好的SQL性能。

0

您是否需要接收全部students

PreparedStatement st = con.prepareStatement("SELECT count(*) FROM student WHERE email=? AND password=?"); 
    st.setString(1, email); 
    st.setString(2, pass); 
    ResultSet rs = st.executeQuery(); 
    rs.next(); 
    int count = rs.getInt(1); 
    if (count == 1) { 
     // password and email are correct 
    } 
0

對於這個答案,我會認爲,通過「驗證電子郵件地址和密碼」,你的意思是你要根據自己的電子郵件地址和密碼來認證用戶。而不是你想檢查電子郵件地址是否是真實的電子郵件地址。

因此,您需要做的第一件事是使用散列算法和隨機鹽加密數據庫中的密碼。您將鹽記錄在哈希密碼旁邊。

接下來的事情是,當用戶登錄時,您會查找該用戶的salt,並且您使用salt執行相同的散列操作。然後,將該結果與以前保存的密碼哈希進行比較,如果它們相同,則密碼相同。

重要的是鹽對於每個用戶都是隨機的和不同的。

上述條款在互聯網上有大量閱讀。

一旦你這樣做了,你也應該在其他答案中應用非常明智的建議,只選擇你想要的用戶,並正確處理你的資源。

警告我不是安全專家,也不是你。如果您正在爲練習實施登錄系統,那很好。如果是針對真實世界,請使用某人知道自己在做什麼的東西。

2

第一個正確關閉所有連接資源 - 使用Java 7試用資源。

下面是一個簡單的例子:

final String email = request.getParameter("email"); 
final String pass = request.getParameter("pass"); 
try (final Connection con = DriverManager.getConnection("jdbc:mysql://localhost:8080/student", "root", "root"); 
     final PreparedStatement statement = con.prepareStatement("SELECT COUNT(*) AS count FROM student WHERE email=? AND password=?");) { 
    statement.setString(1, email); 
    statement.setString(2, pass); 
    try (final ResultSet resultSet = statement.executeQuery()) { 
     if (resultSet.next()) { 
      final int rows = resultSet.getInt("count"); 
      if (rows > 1) { 
       throw new IllegalStateException("More than one row returned!"); 
      } 
      boolean validUser = rows == 1; 
     } 
    } 
} 

不過說真的,你應該在數據庫哈希密碼。使用類似jBcrypt的東西。您的代碼將如下所示:

final String email = request.getParameter("email"); 
final String pass = request.getParameter("pass"); 
try (final Connection con = DriverManager.getConnection("jdbc:mysql://localhost:8080/student", "root", "root"); 
     final PreparedStatement statement = con.prepareStatement("SELECT pass FROM student WHERE email=?");) { 
    statement.setString(1, email); 
    statement.setString(2, pass); 
    try (final ResultSet resultSet = statement.executeQuery()) { 
     if (resultSet.next()) { 
      final String hash = resultSet.getString("pass"); 
      final boolean valid = BCrypt.checkpw(pass, hash); 
     } 
    } 
} 

顯然,如果沒有從查詢返回的行,則需要添加錯誤檢查。您還需要檢查是否只返回一行。但我把它當做一個練習。

+0

如何使用MySQL散列函數,例如'SELECT COUNT(*)AS count FROM student WHERE email =? AND password = MD5(?)'? –

+0

@AntonBoritskiy MD5本身不具有密碼安全性。您需要隨密碼一起存儲的隨機鹽。 BCrypt通過創建一個可以存儲的特殊格式的'String'來實現這一點,否則你需要自己做這個。 –

+0

謝謝你,jBcrypt看起來就像純金。 – Gimby