gpt4 book ai didi

mysql - 如何撤销 MySQL 中用户的所有 EXECUTE 权限?

转载 作者:行者123 更新时间:2023-11-29 15:33:42 25 4
gpt4 key购买 nike

我需要向用户授予执行特定过程的 EXECUTE PROCEDURE 权限,但仅限一段时间。过了该时间段,我想删除用户的所有执行权限 - 但保留已授予的其他权限,例如 SELECT 或 INSERT,完好无损。

如何删除所有执行权限?这似乎不起作用:

将过程 add_data 上的执行授予 user1;

--时间流逝,现在:

将过程 list_data 上的执行权限授予 user1;

--时间过去了,现在是撤销的时候了:

从 user1 撤销 *.* 上的执行;

结果是用户仍然可以执行 add_data 和 list_data。 REVOKE EXECUTE on *.* 仅在用户被授予 EXECUTE ON *.* 时才显示为撤销某些内容,即使如此,它也会删除 *.* 权限,但保留更具体的授权。

我错过了什么吗?我是否必须在表格中跟踪我授予用户的所有权限并一一撤销它们(看起来很疯狂)?

我在 AWS Aurora Serverless 上使用 MySQL 5.6.10。

最佳答案

在不知道您曾经授予用户的所有授权的情况下,SQL 中无法“撤销用户的所有 EXECUTE 授权”。相反,您需要直接修改三个 mysql 表(eek)。像这样:

SET @user = 'myuser';
SET @host = '%';

-- remove all proc-level execute permissions
DELETE FROM mysql.procs_priv WHERE user=@user AND Host=@host AND Proc_priv = 'Execute';

-- remove all db-level execute permissions
UPDATE mysql.db SET Execute_priv = 'N' WHERE user=@user AND Host=@host;

-- remove user-level permission
UPDATE mysql.user SET execute_priv = 'N' WHERE user=@user AND Host=@host;

-- force engine to reload its cached permissions so they take effect now
FLUSH PRIVILEGES

在 MySQL 中,如果您不知道每个用户有三个同时执行权限状态,您很容易意外地向某人授予您不打算授予的权限。

GRANT/REVOKE EXECUTE ON *.*GRANT/REVOKE EXECUTE ON mydb.*GRANT/REVOKE EXECUTE ON PROCEDURE nnn创建三个独立的静态状态,当您进行权限更改时,这些状态同步。

MySQL使用三个权限表来确定EXECUTE权限:user表、db表和procs_priv表。

(1) 将 *.* 上的执行权限授予 user1;

此语句在 user 表中设置一个标志 (execute_priv)。如果用户打开此标志,他们就可以执行任何数据库中的任何过程或函数。

(2) 将 mydb.* 上的执行授予 user1;

此语句在 db 表中为该用户/数据库组合设置一个标志 (Execute_priv)。如果用户为数据库启用了此标志,则他们可以执行该数据库中的任何过程或函数。

(3) 将 PROCEDURE proc 上的执行授予 user1;

此语句在 procs_priv 表中创建一个条目,授权用户执行该特定过程。

在调用函数/存储过程之前,引擎会查看您是否具有用户级权限。如果是这样,它不会再进一步​​查找并继续进行调用。然后它会查看您是否具有数据库级别的权限。最后,它会查看您是否具有特定于过程的权限。

如果您像我一样误解并认为您的授予和撤销语句是在当前权限状态中添加/减去,则可能会导致一个大错误。

示例 1:REVOKE EXECUTE ON *.* FROM user1 不会撤销 user1 的所有 EXECUTE 权限。它从 user1 中删除用户级全局 EXECUTE 权限,并保留所有其他 EXECUTE 权限(数据库级和过程级)。

示例 2:REVOKE EXECUTE ON PROCEDURE proc1 FROM user1不会删除 user1 执行 proc1 的能力。如果只是删除特定的程序级权限。如果用户之前被授予 mydb.* 或 *.* 执行权限,则这些权限在您 REVOKE 后仍然存在。

关于mysql - 如何撤销 MySQL 中用户的所有 EXECUTE 权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58469466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com