MySQL快速禁用账户登入及如何复制/复用账户密码(最新推荐)

 更新时间:2024年01月25日 09:13:30   作者:paul_hch  
这篇文章主要介绍了MySQL如何快速禁用账户登入及如何复制/复用账户密码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

1. 快速临时禁止某用户登入

有几个方法:

  • 修改其密码 ALTER USER x IDENTIFIED BY 'new_passwd',或者将其修改为随机密码 ALTER USER x IDENTIFIED BY RANDOM PASSWORD
  • 锁定其账户 ALTER USER x ACCOUNT LOCK

2. 角色ROLES管理

把角色/ROLES授予某个账号后,记得还要再激活才行:

# 创建ROLE r1并授予用户u1
mysql> CREATE ROLE r1;
mysql> GRANT SELECT ON sbtest.* TO r1;
mysql> GRANT r1 to u1;
# 激活
mysql> SET DEFAULT ROLE r1 TO u1;

关于ROLES还有其他几个有趣的事:

  • 和USERS一样,都存储在mysql.user表。
  • 新创建的ROLE默认是没有密码的 & 密码过期 & 处于LOCK状态。
  • 可以为ROLE设置密码,并对其UNLOCK后(执行ALTER USER命令),也可以像USER那样正常登入了。
  • 将ROLE授予某个账户后,授权不能立即生效,需要新建立连接才可以(如果是直接对账户GRANT授权,无需重连就能立即生效)。

3. 关于授权的其他几点补充

  • 可以对某个表单独授予CREATE\DROP\ALTER等权限。
  • 创建临时表(CREATE TEMPORARY TABLES)的授权只能针对某个DB,不能指定具体数据表名。
  • 无法回收USAGE权限。也就是说想要禁用某账户的话,要么DROP,要么参考上一条方法,修改其密码或将其LOCK,而不能通过回收USAGE权限将其禁用。
  • 利用GRANT授权后,是能立即生效的。也就是说,如果在一个事务中发现权限不够,立即请管理员授权,(不用重新连接)直接重试一次事务,即可成功。
  • MySQL授权支持具体到某个列,但也要注意做好控制。

来举个例子:

# 对账户u1授予对 test.t1 表 c1 列的UPDATE权限
mysql> GRANT UPDATE(c1) ON test.t1 to u1;
# 切换到u1账户登入
$ mysql -hxx -uu1 -pxx test
# 这几个SQL能成功
mysql> UPDATE test.t1 SET c1='c1' LIMIT 1;
mysql> UPDATE test.t1 SET c1=CONCAT('c', rand());
# 这几个SQL则因为权限不足失败了
mysql> UPDATE test.t1 SET c1=CONCAT ('c-new' , c1) ;
ERROR 1143 (42000): SELECT command denied to user 'u1'@'127.0.0.1' for column 'c' in table 't1'
mysql> UPDATE test.t1 SET c1='c1' WHERE id = 1;
ERROR 1143 (42000): SELECT command denied to user 'u1'@'127.0.0.1' for column 'id' in table 't1'

上面这个例子中,因为账户 u1 只有对 test.t1(c1) 列的UPDATE权限,因此是看不到其他列的,即便是读取c1列也不行。在真实生产环境中,可以加上对主键列或其他搜索列的授权,方便加上搜索条件后再更新,例如:

mysql> SHOW GRANTS FOR u1;
| GRANT USAGE ON *.* TO `u1`@`%`                                      |
| GRANT SELECT (`id`, `c1`), UPDATE (`c1`) ON `test`.`t1` TO `u1`@`%` |

4. 如何复制/复用账户密码

采用 mysql_native_password 方式创建用户时,可以直接从其他账户的密码串复制过来作为新账户的密码,例如:

mysql> create user u4 identified with mysql_native_password by 'u4';
mysql> select host,user,plugin,authentication_string from mysql.user where user='u4';
+------+------+-----------------------+-------------------------------------------+
| host | user | plugin                | authentication_string                     |
+------+------+-----------------------+-------------------------------------------+
| %    | u4   | mysql_native_password | *06196708822D12C033A8BF492D3902405DF3C781 |
+------+------+-----------------------+-------------------------------------------+
mysql> create user u5 identified with mysql_native_password as '*06196708822D12C033A8BF492D3902405DF3C781';
mysql> select host,user,plugin,authentication_string from mysql.user where user in ('u4', 'u5');
+------+------+-----------------------+-------------------------------------------+
| host | user | plugin                | authentication_string                     |
+------+------+-----------------------+-------------------------------------------+
| %    | u4   | mysql_native_password | *06196708822D12C033A8BF492D3902405DF3C781 |
| %    | u5   | mysql_native_password | *06196708822D12C033A8BF492D3902405DF3C781 |
+------+------+-----------------------+-------------------------------------------+

但是当使用 caching_sha2_password 创建用户时,就不能这么做了,否则会提示类似下面的报错:

mysql> select host,user,plugin,authentication_string from mysql.user where user='u1'\G
*************************** 1. row ***************************
                 host: %
                 user: u1
               plugin: caching_sha2_password
authentication_string: $A$005$OWA-ad3A,DOzIxrKgUCklxlU/Ty1OHKeGN7LG0QekszR9A6MicWq2
mysql> create user u3 identified with caching_sha2_password as '$A$005$OWA-ad3A,DOzIxrKgUCklxlU/Ty1OHKeGN7LG0QekszR9A6MicWq2';
ERROR 1827 (HY000): The password hash doesn't have the expected format.

经过查阅手册,发现可以用十六进制方式指定密码串,不过前提是需要先设置 print_identified_with_as_hex=1,例如:

mysql> set print_identified_with_as_hex=1;

# 执行SHOW CREATE USER查看现有账户密码串
mysql> show create user u4\G
show create user u4\G
*************************** 1. row ***************************
CREATE USER for u1@%: CREATE USER `u1`@`%` IDENTIFIED WITH 'caching_sha2_password' AS 0x244124303035244F574114162D6114176433411E1C1A2C44194F1B777A4978724B6755436B6C786C552F5479314F484B65474E374C473051656B737A523941364D6963577132 REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT PASSWORD_LOCK_TIME 1

# 复制十六进制密码串,创建新账户即可
mysql> create user u6 identified with caching_sha2_password as 0x244124303035244F574114162D6114176433411E1C1A2C44194F1B777A4978724B6755436B6C786C552F5479314F484B65474E374C473051656B737A523941364D6963577132;

MySQL手册中的相关介绍如下:

Password hash values displayed in the IDENTIFIED WITH clause of output from SHOW CREATE USER may contain unprintable characters that have adverse effects on terminal displays and in other environments. Enabling the print_identified_with_as_hex system variable (available as of MySQL 8.0.17) causes SHOW CREATE USER to display such hash values as hexadecimal strings rather than as regular string literals. Hash values that do not contain unprintable characters still display as regular string literals, even with this variable enabled.

Enjoy GreatSQL 😃

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

转自

GreatSQL

社区有奖建议反馈: https://greatsql.cn/thread-54-1-1.html

社区博客有奖征稿详情: https://greatsql.cn/thread-100-1-1.html

社区2022年度勋章获奖名单: https://greatsql.cn/thread-184-1-1.html

到此这篇关于MySQL如何快速禁用账户登入及如何复制/复用账户密码的文章就介绍到这了,更多相关MySQL禁用账户登入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql日期函数TO_DAYS()函数的详细讲解

    mysql日期函数TO_DAYS()函数的详细讲解

    在SQL中我们经常需要根据时间字段查询数据,今天用到一个好用的时间字段,用来查询一整天的数据,下面这篇文章主要给大家介绍了关于mysql日期函数TO_DAYS()函数的相关资料,需要的朋友可以参考下
    2022-08-08
  • 深入理解 MySQL 索引底层原理

    深入理解 MySQL 索引底层原理

    这篇文章主要介绍了深入理解 MySQL 索引底层原理的相关资料,需要的朋友可以参考下
    2022-12-12
  • DQL命令查询数据实现方法详解

    DQL命令查询数据实现方法详解

    DQL(Data Query Language,数据查询语言),查询数据库数据,如SELECT语句,简单的单表查询或多表的复杂查询和嵌套查询,数据库语言中最核心、最重要的语句,使用频率最高的语句
    2022-09-09
  • MySQL查询in操作 查询结果按in集合顺序显示

    MySQL查询in操作 查询结果按in集合顺序显示

    MySQL 查询in操作,查询结果按in集合顺序显示的实现代码,需要的朋友可以参考下。
    2010-12-12
  • JSP连接MySQL数据库详细步骤

    JSP连接MySQL数据库详细步骤

    这篇文章主要介绍了JSP连接MySQL数据库详细步骤,文章内容详细全面,且通过实例进行讲解,容易理解,需要的朋友可以参考下
    2023-01-01
  • 使用canal监控mysql数据库实现elasticsearch索引实时更新问题

    使用canal监控mysql数据库实现elasticsearch索引实时更新问题

    这篇文章主要介绍了使用canal监控mysql数据库实现elasticsearch索引实时更新,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • MySQL执行计划详解

    MySQL执行计划详解

    给大家带来了关于mysql的相关知识,主要介绍了从Mysql源码中分析执行计划,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈,需要的朋友可以参考下
    2022-09-09
  • MySQL中易被我们忽略的细节

    MySQL中易被我们忽略的细节

    这篇文章主要为大家介绍了几处MySQL中易被我们误会的地方,分享给大家,一来为了有趣,二来为了不让自己踩坑。
    2016-07-07
  • Mysql将查询结果集转换为JSON数据的实例代码

    Mysql将查询结果集转换为JSON数据的实例代码

    这篇文章主要介绍了Mysql将查询结果集转换为JSON数据的实例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 详解mysql8.018在linux上安装与配置过程

    详解mysql8.018在linux上安装与配置过程

    这篇文章主要介绍了mysql8.018在linux上安装与配置过程,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01

最新评论