MySQL - 鎖定使用者賬戶



MySQL 中引入賬戶鎖定是為了透過防止未經授權的事務或可疑活動來提高資料庫的安全性。

在許多情況下,MySQL 使用者賬戶需要出於各種原因被鎖定。例如,在完成賬戶授權之前等待,或者如果賬戶長時間處於非活動狀態等。在這種情況下,鎖定賬戶將提高 MySQL 伺服器的效率。

MySQL 鎖定使用者賬戶

要檢查賬戶是否被鎖定,MySQL 在 'mysql.user' 表中提供了 'account_locked' 屬性,該屬性將分別儲存 'Y' 或 'N' 值。值 'Y' 表示賬戶已鎖定,而 'N' 表示賬戶未鎖定。

鎖定新賬戶

MySQL 提供 ACCOUNT LOCK 子句來鎖定賬戶。將此子句與 CREATE USER 和 ALTER USER 語句一起使用,將分別建立新的已鎖定使用者或鎖定現有使用者。

語法

以下是 CREATE USER... ACCOUNT LOCK 語句的語法:

CREATE USER username@hostname 
IDENTIFIED BY 'new_password' ACCOUNT LOCK;

示例

在以下查詢中,我們使用 CREATE USER 語句在 MySQL 中建立一個新的已鎖定使用者賬戶:

CREATE USER test@localhost IDENTIFIED BY 'asdfgh' ACCOUNT LOCK;

輸出

以下是上述程式碼的輸出:

Query OK, 0 rows affected (0.02 sec)

驗證

我們可以使用以下 SELECT 語句驗證 'test' 使用者的賬戶是否被鎖定:

SELECT User, Host, account_locked 
FROM mysql.user WHERE User = 'test';

上述程式碼的輸出如下所示:

使用者 主機 account_locked
test localhost Y

由於賬戶被鎖定,除非再次解鎖,否則您無法訪問它。請參閱以下示例:

C:\Windows\System32> mysql -u test -p
Enter password: ******

產生的結果如下:

ERROR 3118 (HY000): Access denied for user 'test'@'localhost'. Account is locked.

鎖定現有賬戶

我們可以使用 ALTER USER... ACCOUNT LOCK 語句來鎖定 MySQL 中的現有賬戶。但您必須確保在執行查詢之前使用者處於解鎖狀態。

語法

以下是 ALTER USER... ACCOUNT LOCK 語句的語法:

ALTER USER username@hostname ACCOUNT LOCK;

示例

在這裡,我們使用 ALTER USER 語句鎖定 MySQL 中的現有使用者賬戶:

ALTER USER sample@localhost ACCOUNT LOCK;

輸出

上述程式碼的輸出如下所示:

Query OK, 0 rows affected (0.00 sec)

驗證

我們可以使用以下 SELECT 語句驗證 'sample' 使用者的賬戶是否被鎖定:

SELECT User, Host, account_locked 
FROM mysql.user WHERE User = 'sample';

獲得的結果如下所示:

使用者 主機 account_locked
sample localhost Y

為了驗證賬戶是否被鎖定,讓我們像下面查詢中所示的那樣訪問它:

C:\Windows\System32> mysql -u sample -p
Enter password: ******

我們得到以下輸出:

ERROR 3118 (HY000): Access denied for user 'sample'@'localhost'. Account is locked.

使用客戶端程式鎖定使用者賬戶

現在,在本節中,讓我們討論如何使用各種客戶端程式鎖定 MySQL 使用者。

語法

以下是語法:

以下是使用 PHP 鎖定 MySQL 使用者賬戶的語法:

$sql = "CREATE USER user_name IDENTIFIED BY 'password' ACCOUNT LOCK";
Or,
$sql = "ALTER USER user_name@localhost IDENTIFIED BY 'password' ACCOUNT LOCK";
$mysqli->query($sql);

以下是使用 JavaScript 鎖定 MySQL 使用者賬戶的語法:

sql= "CREATE USER username@hostname IDENTIFIED BY 'new_password' ACCOUNT LOCK";
con.query(sql, function (err, result) {
   if (err) throw err;
      console.log(result);
});

以下是使用 Java 鎖定 MySQL 使用者賬戶的語法:

String sql = "ALTER USER USER_NAME@LOCALHOST IDENTIFIED BY 'password' ACCOUNT LOCK";
Or,
String sql = "CREATE USER USER_NAME IDENTIFIED BY 'password' ACCOUNT LOCK";
statement.execute(sql);

以下是使用 Python 鎖定 MySQL 使用者賬戶的語法:

sql = f"ALTER USER '{username_to_lock}'@'localhost' ACCOUNT LOCK";
cursorObj.execute(sql);

示例

以下是各種程式語言中鎖定使用者的程式:

$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'password';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass);
   if($mysqli->connect_errno ) {
   printf("Connect failed: %s
", $mysqli->connect_error); exit(); } //printf('Connected successfully.
'); $sql = "CREATE USER Sarika IDENTIFIED BY 'password' ACCOUNT LOCK;"; if($mysqli->query($sql)){ printf("User has been locked successfully..!"); } if($mysqli->error){ printf("Failed..!" , $mysqli->error); } $mysqli->close();

輸出

獲得的輸出如下所示:

User has been locked successfully..!
var mysql = require('mysql2');
var con = mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "Nr5a0204@123"
});

  //Connecting to MySQL
  con.connect(function (err) {
  if (err) throw err;
  console.log("Connected!");
  console.log("--------------------------");

  sql = "CREATE USER test@localhost IDENTIFIED BY 'asdfgh' ACCOUNT LOCK;"
  con.query(sql);

  sql = "SELECT User, Host, account_locked FROM mysql.user WHERE User = 'test';";
  con.query(sql, function(err, result){
    if (err) throw err;
    console.log(result);
  });
});

輸出

產生的輸出如下所示:

Connected!
--------------------------
[ { User: 'test', Host: 'localhost', account_locked: 'Y' } ]
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class LockUserAccount {
	public static void main(String[] args) {
		String url = "jdbc:mysql://:3306/TUTORIALS";
		String user = "root";
		String password = "password";
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
            Connection con = DriverManager.getConnection(url, user, password);
            Statement st = con.createStatement();
            //System.out.println("Database connected successfully...!");
            String sql = "ALTER USER Vivek@localhost IDENTIFIED BY 'password' ACCOUNT LOCK";
            st.execute(sql);
            System.out.println("User 'Vivek' account locked successfully...!");    
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
}

輸出

獲得的輸出如下所示:

User 'Vivek' account locked successfully...!
import mysql.connector
# creating the connection object
connection = mysql.connector.connect(
    host='localhost',
    user='root',
    password='password'
)
username_to_lock = 'newUser'
# Create a cursor object for the connection
cursorObj = connection.cursor()
cursorObj.execute(f"ALTER USER '{username_to_lock}'@'localhost' ACCOUNT LOCK")
print(f"User '{username_to_lock}' account is locked successfully.")
cursorObj.close()
connection.close()

輸出

以下是上述程式碼的輸出:

User 'newUser' account is locked successfully.
廣告