簡體   English   中英

用密碼檢查表中是否存在用戶名

[英]Check if username exists in table with password

我創建了一個登錄系統,該系統可以在阻止帳戶三次以上以防密碼失敗多次之前檢查嘗試。 問題是我需要檢查用戶名是否存在,如果不存在,請打印一條消息,指出該ID不存在; 但我不知道該怎么辦。 我的意思是,我有一個想法,但我不知道如何在Java上做到這一點。

這些是我存儲的程序

登錄

create proc usp_Login
   @id varchar(50),
   @pw varchar(50)
as
   select id, pw from Login where id = @id and pw = @pw and lock = 0 and tries < 4
   update Login set tries = 0 where id = @id and pw = @pw;

嘗試

create proc usp_Attempts
   @id varchar(50)
as
   select id, tries from Login where id = @id and tries < 4
   update Login set tries = tries+1 where tries < 4 and id = @id

阻止用戶

create proc usp_Lock
   @id varchar(50)
as
   update Login set lock = 1 where id = @id

Java部分是這樣的:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        CallableStatement cStmt = null;
        ResultSet rs = null;
        try {
            cStmt = conn.prepareCall("{call usp_Login(?, ?)}");
            cStmt.setString(1, this.txtID.getText());
            cStmt.setString(2, this.txtPW.getText());
            cStmt.execute();

            rs = cStmt.getResultSet();

            if (rs.next()) {
                System.out.println("Login done");
                cStmt.close();
                rs.close();
                conn.close();
            } else {
                cStmt = conn.prepareCall("{call usp_Attempts(?)}");
                cStmt.setString(1, this.txtID.getText());
                cStmt.execute();

                rs = cStmt.getResultSet();

                if (rs.next()) {
                    System.out.println("Invalid login");
                } else {
                    cStmt = conn.prepareCall("{call usp_Lock(?)}");
                    cStmt.setString(1, this.txtID.getText());
                    cStmt.execute();

                    System.out.println("Login blocked");
                    cStmt.close();
                    rs.close();
                    conn.close();
                }
            }
        } catch (SQLException ex) {
            System.out.print(ex);
        }
    }

我知道這可能不是登錄系統的最佳方法,但是我仍在學習,這是到目前為止我所知的最佳方法。 希望有人能幫助我做id驗證部分,謝謝。

將所有這些邏輯放入一個單一的存儲過程(SP)。 在此SP正文的最后,執行SELECT v AS RESULT; 其中v是一些整數值。 根據登錄嘗試結果,使該值v不同,例如

  • v = 0表示登錄成功;
  • v = 1表示登錄失敗,因為沒有這樣的用戶名;
  • v = 2表示登錄失敗,因為嘗試登錄時帳戶已被鎖定;
  • v = 3表示登錄失敗,因為密碼不匹配,但是SP未鎖定帳戶;
  • v = 4表示登錄失敗,因為密碼不匹配,並且SP剛剛由於嘗試過多而鎖定了該帳戶。

當然,通過RESULT值,您可以按自己喜歡的任何方式對其他登錄嘗試結果進行編碼。 然后,在Java代碼中,只需檢查SP RESULT值即可確切地知道在此登錄嘗試期間內部發生了什么。 也就是說,在Java代碼中,您將獲得一個包含1行和1列的結果集,稱為RESULT ,只需檢查其值並按照自己的方式進行即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM