菜鸟科技网

MySQL授权命令如何正确使用?

基本语法

GRANT 命令的基本结构如下:

MySQL授权命令如何正确使用?-图1
(图片来源网络,侵删)
GRANT priv_type [(column_list)] ON [object_type] priv_level
    TO user_specification [,...]
    [WITH GRANT OPTION]
    [REQUIRE NONE | [SSL|X509] [CIPHER cipher [AS cipher_name]] [ISSUER issuer_name] [SUBJECT subject_name]]
    [RESOURCE_LIMIT_options]
    [WITH MANAGER OPTION]
    [MAX_QUERIES_PER_HOUR #]
    [MAX_UPDATES_PER_HOUR #]
    [MAX_CONNECTIONS_PER_HOUR #]
    [MAX_USER_CONNECTIONS #]

看起来很复杂,我们通常只使用最核心的部分,下面是一个简化的、更常用的语法:

-- 最核心的语法
GRANT privileges ON database_name.table_name TO 'username'@'host' [IDENTIFIED BY 'password'] [WITH GRANT OPTION];
-- 授予所有权限的常用语法
GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'host' [IDENTIFIED BY 'password'] [WITH GRANT OPTION];

语法参数详解

参数 描述 示例
privileges 权限列表,用逗号隔开,常用权限包括:
- SELECT: 查询
- INSERT: 插入
- UPDATE: 更新
- DELETE: 删除
- CREATE: 创建数据库/表
- DROP: 删除数据库/表
- ALTER: 修改表结构
- INDEX: 创建/删除索引
- GRANT OPTION: 允许将自己获得的权限授权给其他用户
- ALL PRIVILEGESALL: 所有权限
SELECT, INSERT, UPDATE
ALL PRIVILEGES
database_name.table_name 授权的对象。
- : 所有数据库的所有表(超级管理员权限)
- db_name.*: 特定数据库的所有表
- db_name.tbl_name: 特定数据库的特定表
- db_name.proc_name: 特定数据库的特定存储过程
mydb.*
mydb.users
'username'@'host' 用户名主机的组合,这是唯一标识一个用户的关键。
- 'username': 用户名
- 'host': 允许登录的主机地址
- 'localhost': 仅限本机登录
- : 允许从任何主机登录(不推荐在生产环境使用)
- '192.168.1.%': 允许从 168.1. 网段的任何主机登录
'webuser'@'%'
'app'@'192.168.1.10'
'report'@'localhost'
IDENTIFIED BY 'password' 可选,为新用户设置密码,或者为已存在用户修改密码。 IDENTIFIED BY 'MyP@ssw0rd'
WITH GRANT OPTION 可选,拥有此权限的用户可以将自己所拥有的权限,再次授予给其他用户,这是一个非常危险的权限,请谨慎授予。 WITH GRANT OPTION

常用授权场景示例

场景1:创建一个只读用户,允许从任何主机连接

这个用户只能查询 mydb 数据库中的所有数据,不能做任何修改。

-- 授予 mydb 数据库所有表的 SELECT 权限
GRANT SELECT ON mydb.* TO 'readonly_user'@'%' IDENTIFIED BY 'a_strong_password';
-- 刷新权限,使更改生效
FLUSH PRIVILEGES;

场景2:创建一个应用用户,允许对特定表的增删改查

这个用户可以对 mydb 数据库的 users 表进行完整的 CRUD 操作。

-- 授予 mydb.users 表的 SELECT, INSERT, UPDATE, DELETE 权限
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.users TO 'app_user'@'192.168.1.%' IDENTIFIED BY 'app_password_123';
-- 刷新权限
FLUSH PRIVILEGES;

场景3:创建一个数据库管理员,管理特定数据库

这个用户可以管理 mydb 数据库,包括创建表、删除表等,但不能影响其他数据库。

MySQL授权命令如何正确使用?-图2
(图片来源网络,侵删)
-- 授予 mydb 数据库的所有权限
GRANT ALL PRIVILEGES ON mydb.* TO 'dba_user'@'localhost' IDENTIFIED BY 'dba_secure_pass';
-- 刷新权限
FLUSH PRIVILEGES;

场景4:创建一个超级管理员(谨慎使用)

这个用户拥有所有数据库的所有权限,相当于 root 用户,通常只在需要时创建,用完后应立即撤销。

-- 授予所有数据库的所有权限
GRANT ALL PRIVILEGES ON *.* TO 'super_admin'@'localhost' IDENTIFIED BY 'super_secret_password' WITH GRANT OPTION;
-- 刷新权限
FLUSH PRIVILEGES;

重要相关命令

授权之后,通常需要配合以下命令使用:

FLUSH PRIVILEGES

当你执行 GRANTREVOKE 或直接修改 mysql 数据库下的权限表后,需要执行此命令来让服务器重新加载权限表,使更改立即生效。

FLUSH PRIVILEGES;

注意:从 MySQL 5.7.6 开始,如果你使用 GRANT 语句直接创建用户或修改密码,FLUSH PRIVILEGES 会自动执行,但为了清晰和兼容性,手动加上它仍然是一个好习惯。

MySQL授权命令如何正确使用?-图3
(图片来源网络,侵删)

REVOKE (撤销权限)

撤销用户权限的命令,与 GRANT 相对。

语法

REVOKE priv_type [(column_list)] ON database.table FROM 'username'@'host';

示例: 撤销 readonly_userSELECT 权限。

REVOKE SELECT ON mydb.* FROM 'readonly_user'@'%';
FLUSH PRIVILEGES;

注意REVOKE 只会移除特定的权限,而不会删除用户,如果需要删除用户,请使用 DROP USER

SHOW GRANTS (查看用户权限)

查看某个用户拥有哪些权限。

语法

SHOW GRANTS FOR 'username'@'host';

示例: 查看 app_user 的权限。

SHOW GRANTS FOR 'app_user'@'192.168.1.%';

输出结果可能如下:

+------------------------------------------------+
| Grants for app_user@192.168.1.%                |
+------------------------------------------------+
| GRANT USAGE ON *.* TO 'app_user'@'192.168.1.%' |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `mydb`.* TO 'app_user'@'192.168.1.%' |
+------------------------------------------------+

DROP USER (删除用户)

彻底删除一个用户及其所有权限。

语法

DROP USER 'username'@'host';

示例: 删除 readonly_user

DROP USER 'readonly_user'@'%';
FLUSH PRIVILEGES;

最佳实践和安全建议

  1. 遵循最小权限原则:只授予用户完成其任务所必需的最小权限,不要轻易使用 ALL PRIVILEGESGRANT OPTION
  2. 主机限制:永远不要为生产环境用户设置 host 为 ,根据应用服务器的 IP,将其限制为具体的 IP 或 IP 段,如 'app_server'@'10.0.0.10''app_server'@'10.0.0.%'
  3. 使用强密码:为所有用户设置复杂且唯一的密码。
  4. 定期审查权限:使用 SHOW GRANTS 定期检查用户权限,撤销不再需要的权限。
  5. 避免直接操作 mysql 数据库:虽然可以直接修改 mysql.user, mysql.db 等表来管理权限,但强烈推荐使用 GRANTREVOKE 语句,因为它们可以处理更复杂的权限检查和依赖关系,避免出错。
  6. 撤销 GRANT OPTION:除非绝对必要,否则不要授予用户 GRANT OPTION 权限,这可能导致权限失控。

希望这份详细的指南能帮助你熟练掌握 MySQL 的授权命令!

分享:
扫描分享到社交APP
上一篇
下一篇