MySQL 账户锁定

锁是一种用于防止对我们的数据库进行未经授权的修改的机制。这对我们数据库的安全至关重要。在本文中,我们将学习如何使用CREATE USER... ACCOUNT LOCK和ALTER TABLE... ACCOUNT LOCK语句来锁定 MySQL 服务器中的用户帐户。

我们可以使用CREATE USER... ACCOUNT LOCK 语句锁定用户帐户,如下所示:

CREATE USER  account_name IDENTIFIED  BY 'password'  ACCOUNT LOCK;    

ACCOUNT LOCK 子句 指定新用户帐户的初始锁定状态。如果我们没有在语句中指定这个子句,那么新创建的用户默认存储在解锁状态。如果我们在创建用户的过程中启用了validate_password插件,即使它被锁定,我们也无法创建没有密码的帐户。

MySQL还允许我们通过使用 ALTER USER... ACCOUNT LOCK 语句来提供对现有用户帐户的锁定,如下所示:

ALTER USER  account_name IDENTIFIED  BY 'password'  ACCOUNT LOCK;    

如果我们没有在语句中指定 ACCOUNT LOCK 子句,则帐户锁定状态保持不变。

MySQL 使用mysql.user 系统表的 account_locked 列来存储帐户锁定状态。我们可以使用SHOW CREATE USER语句来验证帐户是解锁还是锁定。如果此列值为Y,则表示该帐户已锁定。如果它包含N,则表示该帐户已解锁。

如果我们将尝试访问锁定的帐户,则尝试失败,并且 MySQL 发出错误,将以下消息写入错误日志:

Access denied for user 'user_name'@'host_name'.  
An account is locked.   

一、MySQL 用户帐户锁定的示例

让我们通过示例了解锁定用户帐户的工作原理:

使用 ACCOUNT LOCK 子句锁定新用户帐户

首先,我们将使用以下语句在锁定状态下创建一个名为javatpoint@localhost的新用户帐户:

mysql> CREATE USER IF NOT EXISTS javatpoint@localhost   
IDENTIFIED BY 'jtp123456'  
ACCOUNT LOCK;    

接下来,我们将执行以下语句来显示用户帐户及其状态:

mysql> SELECT user, host, account_locked  
FROM mysql.user  
WHERE user = 'javatpoint' AND host = 'localhost';  

我们应该得到以下输出:

在这个输出中,我们可以看到mysql.user系统表中的account_locked列显示为 Y。这意味着用户名javatpoint在服务器上被锁定。

如果我们尝试访问用户账户 javatpoint 连接 MySQL 服务器,尝试失败,我们将收到错误:

mysql -u javatpoint -p  
Enter password: *********  

这是错误消息:

现有的 MySQL 帐户锁定

我们可以通过使用以下语句创建一个名为markus@localhost的新用户帐户来理解它:

mysql> CREATE USER IF NOT EXISTS markus@localhost   
IDENTIFIED BY 'mark12345';    

接下来,我们将使用新创建的用户帐户markus@localhost登录 MySQL 服务器,如下所示:

mysql -u markus -p  
Enter password: *********  

我们将得到以下输出,这意味着用户帐户markus@localhost已成功登录。

现在,我们将使用ALTER TABLE LOCK ACCOUNT语句来锁定这个用户帐户,如下所示:

mysql> ALTER USER markus@localhost ACCOUNT LOCK;  

同样,我们将执行以下语句来显示用户状态:

mysql> SELECT user, host, account_locked  
FROM mysql.user  
WHERE user = 'markus' AND host = 'localhost';  

我们可以看到以下输出表明用户帐户标记已成功锁定:

如果我们想显示尝试连接到锁定帐户的 MySQL 服务器的次数,我们需要locked_connects 变量。每次我们尝试连接锁定的用户帐户时,MySQL 都会将此变量的状态增加 1。请参见以下命令:

mysql> SHOW GLOBAL STATUS LIKE 'Locked_connects';  

执行后,我们将得到这个输出,表明我们已经尝试了 3 次来连接锁定的用户帐户:

热门文章

优秀文章