锁定是一种机制,用于防止未经授权的对数据库的修改。对于数据库的安全性来说,它是至关重要的。在本文中,我们将学习如何使用 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.
让我们通过示例来了解锁定用户帐户的工作方式:
首先,我们将使用以下语句创建一个名为 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: *********
这是错误信息:
我们可以通过创建一个名为 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';
我们可以看到下面的输出,这表明用户帐户 markus 已成功锁定:
如果我们想要展示被锁定账户的连接MySQL服务器的尝试次数,我们需要使用locked_connects
变量。每次我们尝试连接被锁定的用户账户时,MySQL会把这个变量的状态增加1。请参考下面的命令:
mysql> SHOW GLOBAL STATUS LIKE 'Locked_connects';
执行后,我们将得到如下输出,显示我们已经尝试了三次连接被锁定的用户帐户:
本文链接:http://so.lmcjl.com/news/528/