安全管理
用户管理 / 权限授予与回收 / 密码安全
到目前为止,我们一直用 root 登录——root 是超级管理员,想干嘛干嘛。但实际项目中,不会所有人都用 root。
比如:
- 实习生只要能查数据就行
- 后端程序要能增删改查,但不能删表
- DBA 要能管理所有表结构
这就需要对不同的人分权限。
创建用户
sql
CREATE USER 'zhangsan'@'localhost' IDENTIFIED BY 'mypassword123';拆开看:
'zhangsan'@'localhost'— 用户名 + 从哪里登录。localhost表示只能本机登录IDENTIFIED BY 'mypassword123'— 设置密码
sql
-- 允许从任何机器远程登录
CREATE USER 'zhangsan'@'%' IDENTIFIED BY 'mypassword123';
-- 只允许从特定 IP 登录
CREATE USER 'zhangsan'@'192.168.1.100' IDENTIFIED BY 'mypassword123';权限:GRANT 授权
新用户什么权限都没有。连登录都做不了什么——USE tutorial 也会被拒绝。
授予表级权限
sql
-- 让 zhangsan 能查 users 表
GRANT SELECT ON tutorial.users TO 'zhangsan'@'localhost';
-- 能查、能改、能删
GRANT SELECT, INSERT, UPDATE, DELETE ON tutorial.users TO 'zhangsan'@'localhost';授予库级权限
sql
-- 对整个 tutorial 库有全部表的查询权限
GRANT SELECT ON tutorial.* TO 'zhangsan'@'localhost';
-- 对整个库有全部权限(但不能管理用户)
GRANT ALL PRIVILEGES ON tutorial.* TO 'zhangsan'@'localhost';授予全局权限
sql
-- 超级管理员(和 root 一样)
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;WITH GRANT OPTION 允许他把自己的权限再授予别人。
常用权限速查
| 权限 | 能干嘛 |
|---|---|
SELECT | 查数据 |
INSERT | 插入数据 |
UPDATE | 修改数据 |
DELETE | 删除数据 |
CREATE | 建表 |
ALTER | 改表结构 |
DROP | 删表 |
INDEX | 创建/删除索引 |
ALL PRIVILEGES | 以上全部 |
查看权限
sql
-- 看某个用户的权限
SHOW GRANTS FOR 'zhangsan'@'localhost';+------------------------------------------------------------------------------+
| Grants for zhangsan@localhost |
+------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `zhangsan`@`localhost` |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `tutorial`.`users` TO ... |
+------------------------------------------------------------------------------+GRANT USAGE ON *.* 意思是"能登录,但没全局权限"——所有新用户默认都有这一条。
REVOKE:回收权限
sql
-- 收回删除权限
REVOKE DELETE ON tutorial.users FROM 'zhangsan'@'localhost';
-- 收回所有权限
REVOKE ALL PRIVILEGES ON tutorial.* FROM 'zhangsan'@'localhost';回收的语法和 GRANT 一样,只是关键字从 GRANT ... TO 变成 REVOKE ... FROM。
修改密码
改自己的密码
sql
ALTER USER 'zhangsan'@'localhost' IDENTIFIED BY 'newpassword456';改别人的密码(需要管理员权限)
sql
SET PASSWORD FOR 'zhangsan'@'localhost' = 'newpassword456';删除用户
sql
DROP USER 'zhangsan'@'localhost';权限生效
GRANT 和 REVOKE 的改动会立即生效。但如果改了当前登录用户的权限,需要重新登录才能感受变化。
让权限立即生效:
sql
FLUSH PRIVILEGES;💡 大多数情况下不需要手动 FLUSH——GRANT/REVOKE 会自动更新内存中的权限表。只有在直接操作
mysql.user表时才需要。
安全管理的好习惯
- 不要所有人用 root — 应用连数据库用独立账号,只给必要的权限
- 最小权限原则 — 能用 SELECT 就别给 DELETE,能操作一张表就别给整个库
- 密码强度 — 别用
123456、password - 远程连接要注意 — 生产环境限制
@'%',只允许特定 IP
sql
-- 典型的应用账号:只对业务库有增删改查权限
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'strong_password_here';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'app_user'@'192.168.1.%';小结
安全管理的核心是分权限——不同的人做不同的事:
CREATE USER建用户 — 指定用户名、登录来源、密码GRANT授权 — 可以精确到表级别甚至列级别REVOKE回收 — 语法和 GRANT 一样,TO变FROM- 最小权限原则 — 能 SELECT 就别给 DELETE,能操作一张表就别给整个库
- 应用账号不要用 root — 生产环境给应用建独立账号,只给必须的权限
💡 权限管理是最后一道防线。一个误操作可能删库,但一个权限受限的账号最多删几行。
自主练习
- 创建一个新用户
test_user,只给tutorial库的 SELECT 权限 - 用
SHOW GRANTS查看test_user的权限 - 追加 INSERT 和 UPDATE 权限,再查看确认
- 回收 INSERT 权限,验证只能查不能插