用户权限管理 #

一、用户管理 #

1.1 创建用户 #

sql
-- 创建用户
CREATE USER 'user1'@'%' IDENTIFIED BY 'password123';

-- 指定主机
CREATE USER 'user2'@'localhost' IDENTIFIED BY 'password123';
CREATE USER 'user3'@'192.168.1.%' IDENTIFIED BY 'password123';

-- 创建用户并授予权限
CREATE USER 'admin'@'%' IDENTIFIED BY 'admin123';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%';

-- 查看用户
SELECT User, Host FROM mysql.user;

1.2 修改用户 #

sql
-- 修改密码
ALTER USER 'user1'@'%' IDENTIFIED BY 'newpassword';

-- 修改当前用户密码
ALTER USER USER() IDENTIFIED BY 'newpassword';

-- 重命名用户
RENAME USER 'user1'@'%' TO 'user1_new'@'%';

1.3 删除用户 #

sql
-- 删除用户
DROP USER 'user1'@'%';

-- 删除多个用户
DROP USER 'user2'@'localhost', 'user3'@'192.168.1.%';

二、权限管理 #

2.1 权限类型 #

text
TiDB 权限类型
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│   全局权限 (ON *.*)                                         │
│   ├── ALL PRIVILEGES: 所有权限                             │
│   ├── CREATE: 创建数据库/表                                │
│   ├── DROP: 删除数据库/表                                  │
│   ├── GRANT OPTION: 授权权限                               │
│   ├── PROCESS: 查看进程                                    │
│   ├── RELOAD: 执行 FLUSH                                   │
│   ├── REPLICATION CLIENT: 复制客户端                       │
│   ├── REPLICATION SLAVE: 复制从库                          │
│   ├── SHOW DATABASES: 查看数据库                           │
│   ├── SHUTDOWN: 关闭服务器                                 │
│   └── SUPER: 超级权限                                      │
│                                                             │
│   数据库权限 (ON db.*)                                      │
│   ├── ALL PRIVILEGES                                       │
│   ├── CREATE, DROP                                         │
│   ├── SELECT, INSERT, UPDATE, DELETE                       │
│   └── INDEX, ALTER, CREATE TEMPORARY TABLES                │
│                                                             │
│   表权限 (ON db.table)                                      │
│   ├── SELECT, INSERT, UPDATE, DELETE                       │
│   ├── CREATE, DROP, ALTER, INDEX                           │
│   └── REFERENCES, TRIGGER                                  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

2.2 授予权限 #

sql
-- 授予全局权限
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%';

-- 授予数据库权限
GRANT ALL PRIVILEGES ON mydb.* TO 'user1'@'%';

-- 授予特定权限
GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'user2'@'%';

-- 授予表权限
GRANT SELECT, INSERT ON mydb.users TO 'user3'@'%';

-- 授予列权限
GRANT SELECT(id, name), UPDATE(name) ON mydb.users TO 'user4'@'%';

-- 授予并允许传递授权
GRANT SELECT ON mydb.* TO 'user5'@'%' WITH GRANT OPTION;

2.3 撤销权限 #

sql
-- 撤销全局权限
REVOKE ALL PRIVILEGES ON *.* FROM 'admin'@'%';

-- 撤销数据库权限
REVOKE ALL PRIVILEGES ON mydb.* FROM 'user1'@'%';

-- 撤销特定权限
REVOKE SELECT, INSERT ON mydb.* FROM 'user2'@'%';

-- 撤销表权限
REVOKE SELECT, INSERT ON mydb.users FROM 'user3'@'%';

-- 撤销授权权限
REVOKE GRANT OPTION ON mydb.* FROM 'user5'@'%';

2.4 查看权限 #

sql
-- 查看用户权限
SHOW GRANTS FOR 'user1'@'%';

-- 查看当前用户权限
SHOW GRANTS;

-- 查看所有用户权限
SELECT User, Host, Select_priv, Insert_priv, Update_priv 
FROM mysql.user;

三、角色管理 #

3.1 创建角色 #

sql
-- 创建角色
CREATE ROLE 'app_read', 'app_write', 'app_admin';

-- 查看角色
SELECT User, Host FROM mysql.user WHERE Account_locked = 'Y';

3.2 角色授权 #

sql
-- 给角色授权
GRANT SELECT ON mydb.* TO 'app_read';
GRANT INSERT, UPDATE, DELETE ON mydb.* TO 'app_write';
GRANT ALL PRIVILEGES ON mydb.* TO 'app_admin';

-- 将角色授予用户
GRANT 'app_read' TO 'reader'@'%';
GRANT 'app_read', 'app_write' TO 'writer'@'%';
GRANT 'app_admin' TO 'admin'@'%';

3.3 使用角色 #

sql
-- 设置默认角色
SET DEFAULT ROLE 'app_read' TO 'reader'@'%';
SET DEFAULT ROLE ALL TO 'admin'@'%';

-- 启用角色
SET ROLE 'app_read';
SET ROLE ALL;
SET ROLE NONE;

-- 查看当前角色
SELECT CURRENT_ROLE();

3.4 删除角色 #

sql
-- 撤销用户的角色
REVOKE 'app_read' FROM 'reader'@'%';

-- 删除角色
DROP ROLE 'app_read', 'app_write';

四、安全最佳实践 #

4.1 密码安全 #

sql
-- 使用强密码
CREATE USER 'secure_user'@'%' 
IDENTIFIED BY 'Str0ngP@ssw0rd!2024';

-- 设置密码过期
ALTER USER 'user1'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;

-- 立即过期
ALTER USER 'user1'@'%' PASSWORD EXPIRE;

-- 永不过期
ALTER USER 'user1'@'%' PASSWORD EXPIRE NEVER;

4.2 最小权限原则 #

sql
-- 只授予必要的权限
-- 只读用户
GRANT SELECT ON mydb.* TO 'readonly'@'%';

-- 只写用户
GRANT INSERT, UPDATE, DELETE ON mydb.* TO 'writeonly'@'%';

-- 避免使用 ALL PRIVILEGES
-- ✗ 不推荐
GRANT ALL PRIVILEGES ON *.* TO 'app_user'@'%';
-- ✓ 推荐
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app_user'@'%';

4.3 连接安全 #

sql
-- 限制连接主机
CREATE USER 'internal'@'10.0.%' IDENTIFIED BY 'password';
CREATE USER 'local'@'localhost' IDENTIFIED BY 'password';

-- 要求 SSL 连接
CREATE USER 'ssl_user'@'%' IDENTIFIED BY 'password' REQUIRE SSL;

-- 要求 X509 证书
CREATE USER 'cert_user'@'%' IDENTIFIED BY 'password' REQUIRE X509;

五、权限审计 #

5.1 查看用户活动 #

sql
-- 查看当前连接
SHOW PROCESSLIST;

-- 查看连接统计
SELECT 
    USER,
    HOST,
    DB,
    COUNT(*) AS connection_count
FROM INFORMATION_SCHEMA.PROCESSLIST
GROUP BY USER, HOST, DB;

5.2 审计日志 #

sql
-- 启用审计日志 (需要配置)
-- 在配置文件中设置:
-- [log]
-- enable-audit = true

-- 查看审计日志
-- 日志位置: {deploy_dir}/log/tidb_audit.log

六、总结 #

用户权限管理要点:

模块 要点
用户管理 创建、修改、删除用户
权限管理 授予、撤销、查看权限
角色管理 创建角色、角色授权
安全实践 强密码、最小权限、连接限制

下一步,让我们学习备份与恢复!

最后更新:2026-03-27