[英]How do you revoke all EXECUTE privileges for a user in MySQL?
我只需要在一段时间内向用户授予特定过程的 EXECUTE PROCEDURE 权限。 在这段时间之后,我想删除用户的所有执行权限 - 但保留已授予的其他权限,如 SELECT 或 INSERT,保持不变。
你如何删除所有执行权限? 这似乎不起作用:
GRANT EXECUTE ON PROCEDURE add_data TO user1;
——时间过去了,现在:
将 PROCEDURE list_data 上的执行权限授予 user1;
-- 时间过去了,现在该撤销了:
REVOKE EXECUTE ON *.* FROM 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 中,如果您不知道每个用户同时存在三个EXECUTE 权限状态,您很容易意外地授予某人您不打算授予的权限。
GRANT/REVOKE EXECUTE ON *.*
、 GRANT/REVOKE EXECUTE ON mydb.*
和GRANT/REVOKE EXECUTE ON PROCEDURE nnn
创建三个独立的 static 状态,这些状态在您进行权限更改时不会同步。
MySQL 使用三个权限表来确定 EXECUTE 权限:user 表、db 表和 procs_priv 表。
(1) GRANT EXECUTE ON *.* TO user1;
此语句在用户表中设置一个标志 (execute_priv)。 如果用户打开了这个标志,他们可以在任何数据库中执行任何过程或 function。
(2) GRANT EXECUTE ON mydb.* TO user1;
此语句在db表中为该用户/数据库组合设置一个标志 (Execute_priv)。 如果用户为数据库启用了此标志,他们可以在该数据库中执行任何过程或 function。
(3) GRANT EXECUTE ON PROCEDURE proc TO user1;
此语句在procs_priv表中创建一个条目,授权用户执行该特定过程。
在函数/存储过程调用之前,引擎会查看您是否具有用户级权限。 如果是这样,它不会再看下去并继续进行调用。 然后它会查看您是否具有数据库级权限。 最后,它会查看您是否具有特定于过程的权限。
如果您像我一样误解并认为您的授权和撤销声明正在从当前权限 state 中添加/减去,这可能会导致一个大错误。
示例 1: REVOKE EXECUTE ON *.* FROM user1
不会撤销 user1 的所有 EXECUTE 权限。 它从 user1 中删除用户级别的全局 EXECUTE 权限,并保留所有其他 EXECUTE 权限(数据库级别和过程级别)。
示例 2: REVOKE EXECUTE ON PROCEDURE proc1 FROM user1
不会取消 user1 执行 proc1 的能力。 如果只删除特定的过程级权限。 如果用户之前被赋予了 mydb.* 或 *.* 执行权限,那么在 REVOKE 之后这些权限仍然存在。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.