我有一个可以从任何主机访问的用户(我们目前正在开发中)。但我想限制存储过程的执行仅限于本地主机。问题是localhost
无法识别该用户。
DROP USER IF EXISTS 'admin'@'%';
CREATE USER IF NOT EXISTS 'admin'@'%' IDENTIFIED WITH 'caching_sha2_password' BY 'my_password';
###########################
### STORED PROCEDURES ###
###########################
GRANT EXECUTE ON MY_DATABASE.* TO 'admin'@'127.0.0.1';
###########################
### SELECT ###
###########################
GRANT SELECT ON MY_DATABASE.MY_TABLE TO 'admin'@'%' WITH GRANT OPTION;
GRANT SELECT ON MY_DATABASE.MY_TABLE2 TO 'admin'@'%' WITH GRANT OPTION;
.
.
.
执行此代码会引发下一个错误。
[2024-11-23 20:59:09] [42000][1410] You are not allowed to create a user with GRANT
更改主机“解决”了错误,但我想将执行限制在本地主机。我不知道是否只需像这样添加新用户。
CREATE USER IF NOT EXISTS 'admin'@'127.0.0.1' IDENTIFIED WITH 'caching_sha2_password' BY 'my_password';
###########################
### STORED PROCEDURES ###
###########################
GRANT EXECUTE ON MY_DATABASE.* TO 'admin'@'127.0.0.1';
###########################
### SELECT ###
###########################
GRANT SELECT ON MY_DATABASE.MY_TABLE1 TO 'admin'@'127.0.0.1' WITH GRANT OPTION;
GRANT SELECT ON MY_DATABASE.MY_TABLE2 TO 'admin'@'127.0.0.1' WITH GRANT OPTION;
.
.
.
或者是否有另一种方法,无需重复用户定义
对于 MySQL 来说,用户是用户名和固定字符串(即主机名)的组合。主机名字符串可以包含通配符
%
或_
,但它仍然是固定字符串。如果你查询,
select user, host from mysql.user
你会看到那个固定的字符串。这就是用户条目。您只能通过定义的名称向用户授予权限。如果您只定义了一个名为 的用户
admin@%
,那么这就是唯一存在的用户。您无法授予权限,[email protected]
因为该用户不存在。您可以定义两个用户,一个是 named
admin@%
,另一个是 named[email protected]
。这是两个独立的用户,可以授予不同的权限。当客户端通过 TCP 连接时,它会针对主机部分与客户端 IP 地址更明确匹配的用户进行身份验证。在这种情况下,如果您从 127.0.0.1(通过 TCP 的本地主机)连接,它将优先进行身份验证,
[email protected]
并且一旦通过身份验证,会话将具有您授予该用户的权限。