用户管理与权限控制
第十二章:用户管理与权限控制
💡 数据库安全的核心是用户管理和权限控制
12.1 用户管理概述
12.1.1 MySQL 用户体系
12.1.2 MySQL vs SQL Server 用户管理
| 特性 |
SQL Server |
MySQL |
| 认证层级 |
登录名 → 数据库用户 |
用户(包含主机信息) |
| 用户标识 |
登录名 |
用户名@主机名 |
| 默认管理员 |
sa |
root |
12.2 创建用户
12.2.1 CREATE USER 语句
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
CREATE USER 'zhangsan'@'localhost' IDENTIFIED BY '123456';
CREATE USER 'lisi'@'%' IDENTIFIED BY '123456';
CREATE USER 'wangwu'@'192.168.1.100' IDENTIFIED BY '123456';
CREATE USER 'zhaoliu'@'192.168.1.%' IDENTIFIED BY '123456';
12.2.2 主机名说明
| 主机名 |
说明 |
localhost |
仅允许本地连接 |
% |
允许任意主机连接 |
192.168.1.100 |
仅允许指定IP连接 |
192.168.1.% |
允许指定网段连接 |
%.example.com |
允许指定域名连接 |
12.2.3 查看用户
SELECT User, Host FROM mysql.user;
SELECT USER();
SELECT CURRENT_USER();
SELECT * FROM mysql.user WHERE User = 'zhangsan'\G
12.3 修改用户
12.3.1 修改用户名
RENAME USER '旧用户名'@'主机名' TO '新用户名'@'主机名';
RENAME USER 'zhangsan'@'localhost' TO 'zhang3'@'localhost';
12.3.2 修改用户密码
ALTER USER '用户名'@'主机名' IDENTIFIED BY '新密码';
SET PASSWORD FOR '用户名'@'主机名' = '新密码';
SET PASSWORD = '新密码';
ALTER USER 'zhangsan'@'localhost' IDENTIFIED BY 'newpassword123';
12.4 删除用户
DROP USER '用户名'@'主机名';
DROP USER IF EXISTS '用户名'@'主机名';
DROP USER 'user1'@'localhost', 'user2'@'%';
12.5 权限管理
12.5.1 MySQL 权限类型
| 权限类型 |
说明 |
权限示例 |
| 数据权限 |
对数据的操作权限 |
SELECT, INSERT, UPDATE, DELETE |
| 结构权限 |
对结构的操作权限 |
CREATE, ALTER, DROP, INDEX |
| 管理权限 |
数据库管理权限 |
GRANT OPTION, CREATE USER |
常用权限列表:
| 权限 |
说明 |
ALL PRIVILEGES |
所有权限(不包括GRANT OPTION) |
SELECT |
查询数据 |
INSERT |
插入数据 |
UPDATE |
更新数据 |
DELETE |
删除数据 |
CREATE |
创建数据库/表 |
DROP |
删除数据库/表 |
ALTER |
修改表结构 |
INDEX |
创建/删除索引 |
EXECUTE |
执行存储过程 |
GRANT OPTION |
授予权限给其他用户 |
12.5.2 授予权限(GRANT)
GRANT 权限列表 ON 数据库.表 TO '用户名'@'主机名';
GRANT SELECT ON school.student TO 'zhangsan'@'localhost';
GRANT SELECT, INSERT, UPDATE ON school.student TO 'zhangsan'@'localhost';
GRANT SELECT ON school.* TO 'zhangsan'@'localhost';
GRANT SELECT ON *.* TO 'zhangsan'@'localhost';
GRANT ALL PRIVILEGES ON school.* TO 'zhangsan'@'localhost';
GRANT ALL PRIVILEGES ON school.* TO 'zhangsan'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
12.5.3 撤销权限(REVOKE)
REVOKE 权限列表 ON 数据库.表 FROM '用户名'@'主机名';
REVOKE INSERT ON school.student FROM 'zhangsan'@'localhost';
REVOKE SELECT, UPDATE ON school.student FROM 'zhangsan'@'localhost';
REVOKE ALL PRIVILEGES ON school.* FROM 'zhangsan'@'localhost';
REVOKE GRANT OPTION ON school.* FROM 'zhangsan'@'localhost';
FLUSH PRIVILEGES;
12.5.4 查看权限
SHOW GRANTS FOR '用户名'@'主机名';
SHOW GRANTS;
SHOW GRANTS FOR 'zhangsan'@'localhost';
12.6 角色管理(MySQL 8.0+)
12.6.1 什么是角色
定义:角色是一组权限的集合,可以将角色授予用户,简化权限管理。
12.6.2 创建和使用角色
CREATE ROLE 'readonly', 'readwrite', 'admin';
GRANT SELECT ON school.* TO 'readonly';
GRANT SELECT, INSERT, UPDATE, DELETE ON school.* TO 'readwrite';
GRANT ALL PRIVILEGES ON school.* TO 'admin';
GRANT 'readonly' TO 'user1'@'localhost';
GRANT 'readwrite' TO 'user2'@'localhost';
GRANT 'admin' TO 'user3'@'localhost';
SET DEFAULT ROLE 'readonly' TO 'user1'@'localhost';
SET DEFAULT ROLE ALL TO 'user2'@'localhost';
REVOKE 'readwrite' FROM 'user2'@'localhost';
DROP ROLE 'readonly';
12.7 完整示例
12.7.1 创建只读用户
CREATE USER 'reader'@'%' IDENTIFIED BY 'reader123';
GRANT SELECT ON school.* TO 'reader'@'%';
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'reader'@'%';
12.7.2 创建应用程序用户
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'app123456';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'app_user'@'192.168.1.%';
FLUSH PRIVILEGES;
12.7.3 创建DBA用户
CREATE USER 'dba'@'localhost' IDENTIFIED BY 'dba123456';
GRANT ALL PRIVILEGES ON *.* TO 'dba'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
12.8 快速参考
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
DROP USER IF EXISTS '用户名'@'主机名';
ALTER USER '用户名'@'主机名' IDENTIFIED BY '新密码';
RENAME USER '旧用户'@'主机' TO '新用户'@'主机';
GRANT 权限 ON 数据库.表 TO '用户'@'主机';
REVOKE 权限 ON 数据库.表 FROM '用户'@'主机';
SHOW GRANTS FOR '用户'@'主机';
FLUSH PRIVILEGES;
CREATE ROLE '角色名';
GRANT 权限 ON 数据库.表 TO '角色名';
GRANT '角色名' TO '用户'@'主机';
SET DEFAULT ROLE '角色名' TO '用户'@'主机';
DROP ROLE '角色名';
⬅️ 存储过程与函数 🏠 00-数据库 ➡️ 事务与并发控制
💬 评论