在MySQL权限体系中,GRANT OPTION是一个特殊的权限标识,拥有该权限的用户可以将自己持有的权限授予其他用户,这就可能导致权限被无限制扩散。要防止授权用户进行扩散授权,核心就是禁止给普通用户赋予GRANT OPTION权限。

GRANT OPTION的作用与风险
GRANT OPTION本身不是具体的操作权限,而是一种授权传递权限。当用户A拥有某个库表的SELECT权限同时带有GRANT OPTION时,用户A可以把这个SELECT权限授予用户B,用户B也可以继续向下传递,除非管理员主动干预。
这种机制在需要层级化权限管理的场景中有一定作用,但在大多数普通业务场景中,只会带来权限失控的风险,比如普通开发人员可能误将自己的权限授予无关人员,导致数据访问范围扩大。
授权时禁用GRANT OPTION的操作
在给新用户授权时,只要不主动添加WITH GRANT OPTION子句,默认就不会赋予扩散授权权限。以下是标准的普通授权示例:
-- 给用户test_user授予test_db库的查询权限,不赋予GRANT OPTION GRANT SELECT ON test_db.* TO 'test_user'@'localhost' IDENTIFIED BY 'test_password'; -- 刷新权限使配置生效 FLUSH PRIVILEGES;
如果需要同时授予多个权限,同样不要添加WITH GRANT OPTION即可:
-- 授予查询、插入、更新权限,无扩散授权能力 GRANT SELECT, INSERT, UPDATE ON test_db.* TO 'test_user'@'localhost' IDENTIFIED BY 'test_password'; FLUSH PRIVILEGES;
回收已有用户的GRANT OPTION权限
如果已经给部分用户赋予了GRANT OPTION,需要单独回收该权限,不能直接回收用户的其他操作权限。可以通过REVOKE语句实现:
-- 回收test_user的GRANT OPTION权限,不影响其原本的SELECT等权限 REVOKE GRANT OPTION ON test_db.* FROM 'test_user'@'localhost'; FLUSH PRIVILEGES;
如果要查看某个用户是否拥有GRANT OPTION权限,可以查询MySQL的权限表:
-- 查询指定用户的授权权限情况 SELECT user, host, Grant_priv FROM mysql.user WHERE user = 'test_user'; -- 查询指定用户对某库的权限详情 SHOW GRANTS FOR 'test_user'@'localhost';
权限管控的额外建议
除了禁用GRANT OPTION,还可以遵循最小权限原则,只给用户授予完成工作所必需的最低权限,比如业务用户只需要查询权限就不要授予修改、删除权限。同时定期审计用户权限列表,及时回收不再使用的账号和多余权限,进一步降低权限扩散的风险。
常见问题说明
很多用户会疑惑,回收了GRANT OPTION之后,用户之前已经授予其他用户的权限会不会消失。答案是不会,GRANT OPTION只限制后续的授权行为,已经完成的授权仍然有效,如果需要收回之前扩散的权限,需要单独对对应的被授权用户执行REVOKE操作。
另外,MySQL的root用户默认拥有GRANT OPTION权限,这是管理员账号的正常配置,不需要修改,只要保证root账号的密码足够复杂,且不被无关人员使用即可。
MySQLGRANT_OPTION用户授权权限管控修改时间:2026-06-09 07:27:15