mysql如何禁止用户修改自己的密码_调整mysql数据库的Update权限

陌墨同学_6132

陌墨同学_6132

2026-04-17

258人浏览

原创

mysql本身不提供禁止用户修改自己密码的权限开关,仅能通过撤销create user等高权限或采用外部认证方式间接限制。

mysql如何禁止用户修改自己的密码_调整mysql数据库的update权限

MySQL 本身没有禁止用户改自己密码的权限开关

直接说结论:ALTER USER、SET PASSWORD 这类操作,只要用户有 CREATE USER 或更高权限(比如 UPDATE 权限作用于 mysql.user 表),就能执行。MySQL 没提供类似 DENY ALTER USER 的语法,也没有 password_change_priv 这种细粒度权限。

所谓“禁止修改密码”,实际能做的只有两种路径:

  • 撤掉用户的 CREATE USER 权限(以及 INSERT/UPDATE 权限,如果它被直接赋在 mysql 库上)
  • 用外部认证方式绕过 MySQL 密码管理,比如 PAM 或 LDAP —— 此时密码根本不由 MySQL 存储或校验,自然无法从内部修改

注意:单纯 revoke UPDATE 权限对 mysql.user 表,**不一定生效**。因为 SET PASSWORD 和 ALTER USER ... IDENTIFIED BY 是专用语句,不走常规表更新路径,它们依赖的是全局权限而非具体表权限。

validate_password 插件不是“禁止”,而是“校验失败”

很多人误以为调低 validate_password_policy 就是“放开限制”,其实它只控制新密码是否被接受。哪怕你把策略设成 LOW,只要用户执行 ALTER USER 'u'@'%' IDENTIFIED BY '123',且当前 validate_password_length = 8,仍会报错:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。

关键点:

  • validate_password 插件默认只在创建用户、ALTER USER、SET PASSWORD 时触发,不检查已存在的弱密码
  • 它不区分用户角色——root 和普通用户一视同仁
  • 即使你 REVOKE CREATE USER ON *.* FROM 'u'@'%',只要该用户之前有这个权限并没被刷新,仍可能成功改密(权限缓存未失效)

想真正锁死密码,只能靠外部认证或禁用相关语句

如果你控制着 MySQL 部署环境,且需要强约束(比如审计要求“密码由 IAM 统一管理”),可行做法是:

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 卸载 validate_password 插件(UNINSTALL PLUGIN validate_password;),再启用可插拔认证,例如:CREATE USER 'u'@'%' IDENTIFIED WITH authentication_ldap_sasl AS 'uid=u,ou=people,dc=example,dc=com';
  • 在数据库前置加代理层(如 ProxySQL),拦截含 ALTER USER、SET PASSWORD 的语句并返回拒绝
  • 用操作系统级限制:仅允许特定 IP 或跳板机连接,再配合数据库防火墙规则过滤敏感语法(需企业版或第三方组件)

直接改 mysql.user 表字段(比如清空 authentication_string)不可取——MySQL 8.0+ 已弃用 Password 字段,且手动 UPDATE 不触发权限重载,还容易破坏 hash 格式导致用户彻底无法登录。

flush privileges 不解决权限实时性问题

很多教程强调改完 mysql.user 表后必须 FLUSH PRIVILEGES,但这只对「通过直接写表方式授予权限」有效。而现代 MySQL 推荐用 GRANT/REVOKE,这些命令会自动刷新内存缓存,无需手动 flush。

更关键的是:FLUSH PRIVILEGES 并不会让一个已有连接立即失去刚被 revoke 的权限——它只影响后续新连接。也就是说,用户如果已经连着,他还能继续执行 SET PASSWORD 直到断开重连。

所以,真要阻断某用户改密行为,得结合连接管理:

  • 查出该用户的活跃连接:SELECT ID, USER, HOST, COMMAND FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'u';
  • 强制踢下线:KILL [ID];
  • 再 revoke 权限,此时新连接就拿不到改密能力了

生产环境里,最常被忽略的其实是权限缓存延迟和连接长活问题——你以为权限已撤,其实用户还在旧会话里自由操作。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4203

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

891

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1089

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6101

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2963

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6060

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8161

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1110

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

972

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 183人学习