MySQL用户管理与权限控制详解

一、用户表(user)核心结构

MySQL用户账户信息存储在系统数据库mysqluser表中,核心字段解析:

字段名称 说明 示例值
user 用户名(唯一标识) admin
host 允许登录的主机地址(支持通配符) localhost / %.example.com / 192.168.1.%
authentication_string 加密后的登录密码(MySQL 5.7+使用caching_sha2_password默认加密) *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
ssl_cipher SSL连接时使用的加密算法 AES256-SHA
x509_issuer X.509证书颁发者(用于SSL验证) CN=MySQL Server
plugin 身份验证插件(默认caching_sha2_password,旧版本为mysql_native_password caching_sha2_password

二、用户账户管理

1. 创建用户

sql 复制代码
-- 标准语法(推荐)
CREATE USER '用户名'@'登录主机' 
IDENTIFIED BY '密码' [EXPIRE NEVER | DEFAULT]  -- 密码有效期(默认永久有效)
[REQUIRE SSL | X509]  -- 强制使用安全连接
[WITH MAX_QUERIES_PER_HOUR 1000];  -- 资源限制(可选)

-- 示例:
-- 允许本地登录的用户
CREATE USER 'dev'@'localhost' IDENTIFIED BY 'Dev@123456';
-- 允许任意主机登录(谨慎!)
CREATE USER 'remote_user'@'%' IDENTIFIED BY 'StrongPwd!123';
-- 创建时指定SSL连接
CREATE USER 'secure_user'@'%' IDENTIFIED BY 'Pwd123' REQUIRE SSL;

2. 删除用户

sql 复制代码
-- 标准语法(MySQL 8.0+支持IF EXISTS避免报错)
DROP USER IF EXISTS '用户名'@'登录主机';

-- 示例:
DROP USER 'test_user'@'%';  -- 删除远程用户
DROP USER 'local_admin'@'localhost';  -- 删除本地用户

三、权限管理核心操作

1. 授予权限

sql 复制代码
-- 语法格式
GRANT <权限列表> ON <数据库.对象> TO '用户名'@'登录主机'
[IDENTIFIED BY '新密码']  -- 可选:授权时修改密码
[WITH GRANT OPTION];  -- 允许用户将权限转授给其他用户

-- 权限列表说明:
-- 单个权限:SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER等
-- 组合权限:ALL PRIVILEGES(除GRANT OPTION外的所有权限)
-- 特殊权限:GRANT OPTION(授权权限)

-- 对象范围:
-- *.*:所有数据库的所有对象
-- db_name.*:指定数据库的所有对象
-- db_name.table_name:指定数据库的特定表
-- COLUMN权限:GRANT SELECT (col1, col2) ON db.table TO ...

-- 示例:
-- 授予test库所有表的读写权限
GRANT SELECT, INSERT, UPDATE, DELETE ON test.* TO 'app_user'@'%';
-- 授予所有数据库的管理权限(谨慎!)
GRANT ALL PRIVILEGES ON *.* TO 'dba'@'localhost' WITH GRANT OPTION;
-- 授权时修改密码
GRANT SELECT ON mysql.* TO 'audit'@'192.168.1.100' IDENTIFIED BY 'NewPwd!456';

2. 回收权限

sql 复制代码
-- 语法格式
REVOKE <权限列表> ON <数据库.对象> FROM '用户名'@'登录主机';

-- 示例:
-- 回收test库的删除权限
REVOKE DELETE ON test.* FROM 'app_user'@'%';
-- 回收所有权限(保留用户账户)
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'temp_user'@'localhost';

四、密码管理最佳实践

1. 修改密码的三种方式

sql 复制代码
-- 方式1:使用ALTER USER(推荐,安全合规)
ALTER USER '用户名'@'登录主机' 
IDENTIFIED BY '新密码'  -- 自动更新authentication_string
[EXPIRE AFTER 30 DAYS];  -- 设置密码有效期(如30天)

-- 方式2:直接操作user表(需刷新权限,不推荐)
UPDATE mysql.user SET authentication_string = SHA2('新密码', 512) 
WHERE user = 'lhd' AND host = 'localhost';
FLUSH PRIVILEGES;  -- 手动刷新权限缓存

-- 方式3:客户端命令行(临时登录时使用)
mysqladmin -u用户名 -p旧密码 password '新密码'

2. 密码加密机制

  • MySQL 5.7之前 :使用PASSWORD()函数(SHA1加密,安全性较低)

  • MySQL 5.7+ :默认使用caching_sha2_password插件(SHA2-512加密)

  • 兼容性处理

    sql 复制代码
    -- 允许旧版客户端连接(使用mysql_native_password)
    ALTER USER 'legacy_user'@'%' IDENTIFIED WITH mysql_native_password BY '旧密码';

五、权限刷新与状态查看

1. 刷新权限缓存

sql 复制代码
FLUSH PRIVILEGES;  -- 强制重新加载权限表(修改user表后必需)

2. 查看当前用户与权限

sql 复制代码
-- 查看当前登录用户
SELECT CURRENT_USER(), USER(), SESSION_USER();  -- 三者可能不同(需注意主机匹配)

-- 查看指定用户的权限
SHOW GRANTS FOR '用户名'@'登录主机';  -- 显示授权语句
SHOW GRANTS;  -- 显示当前用户权限(等效于SHOW GRANTS FOR CURRENT_USER())

-- 直接查询user表(需有SUPER权限)
SELECT user, host, plugin, ssl_cipher FROM mysql.user;

六、安全最佳实践

  1. 最小权限原则

    • 不为应用用户授予ALL PRIVILEGES,按需分配最小权限
    • 禁止使用'root'@'%'账户远程登录
  2. 定期清理无效账户

    sql 复制代码
    -- 删除90天未登录的用户(需配合审计日志)
    DELETE FROM mysql.user WHERE last_active < NOW() - INTERVAL 90 DAY;
  3. 启用安全连接

    sql 复制代码
    -- 要求客户端使用SSL连接
    ALTER USER 'secure_user'@'%' REQUIRE SSL;
    -- 查看服务器SSL状态
    SHOW STATUS LIKE 'Ssl_%';
  4. 监控权限变更

    • 开启二进制日志记录权限操作
    • 使用FLUSH PRIVILEGES后检查general_log

总结

MySQL用户管理通过user表和权限系统实现细粒度控制,核心操作包括用户创建、权限授予/回收、密码管理。实践中需遵循"最小权限"和"安全连接"原则,避免直接操作系统表,优先使用GRANT/ALTER USER等标准语句。定期审计用户列表和权限配置,是保障数据库安全的重要手段。

相关推荐
阿巴斯甜13 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker14 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952715 小时前
Andorid Google 登录接入文档
android
黄林晴16 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_2 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android