老板:让你添加一个mysql用户并给予权限这么费劲吗?

前言

在这里插入图片描述

今天,程序员小王被老板训了一顿,还被扣了1k的工资,原因就是因为有一个项目已经上线,客户这边要求给数据库新添加一个用户,并给予用户某些权限,但是小王由于对这么方面有点生疏,都是现百度现实现,导致工作效率低,引发了老板的不满。
小王痛定思痛,下决心要搞明白mysql的创建用户及授权,经过查阅各种资料学习, 小王对此了解的八九不离十了,从而在老板面前硬了起来……

一、新建一个用户

老板:给我新建一个用户joytom,密码设置为123321,并任意远程主机都能访问,五分钟完成,实现不了就给我提桶走人!

小王会心一笑,对创建用户的命令早已滚瓜烂熟了,于是熟练的操作了起来:

1、创建用户命令:

CREATE USER ‘username‘@’host’ IDENTIFIED BY ‘password’;

属性名 含义
username 登陆用户名
host 指定可访问的ip,如果指定所有ip都能访问,将其设为通配符%即可。
password 登陆密码,如果密码为空则无需密码

2、创建用户

mysql> CREATE USER 'joytom'@'%' IDENTIFIED BY '123321';
Query OK, 0 rows affected (0.00 sec)

查看一下是否创建成功:

mysql> select user,host from user;
+----------+---------------+
| user     | host          |
+----------+---------------+
| copytest | %             |
| joytom   | %             |
| test     | %             |
| root     | 127.0.0.1     |
| root     | ::1           |
|          | localhost     |
| root     | localhost     |
|          | vm-8-5-centos |
| root     | vm-8-5-centos |
+----------+---------------+
10 rows in set (0.00 sec)

3、从另一台服务器上远程登录一下:

[root@instance-lzmtqrkn ~]# mysql -h 创建用户的服务器公网ip -P 3306 -u joytom -p123321

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 784
Server version: 5.6.49-log Source distribution

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.03 sec)

查看一下数据库,发现是没有权限的,只能看到information_schema数据库。

二、为用户授权

创建完用户后……

老板:好,比以前有进步了,那你再给joytom这个用户设置一个权限,只允许查询和修改copytest数据库中的student表

小王信手拈来,又熟练的操作了一波:

1、给用户授权命令

grant privileges on database.tablename to “username”@’host’;

privileges:用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所的权限则使用ALL。

属性名 含义
privileges 用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所的权限则使用ALL。
database 如果不指定数据库,直接*.*即可,如果指定数据库但不指定表名,则database.*即可。
username 登陆的用户名
host 给予授权的主机ip,例如我想让用户A的ip使用joytom用户所授予的权限,但是不想让用户B的ip来使用joytom用户的权限

2、给joytom用户授可查、改的权限。

mysql> grant select,update on copytest.student to "joytom"@'%';
Query OK, 0 rows affected (0.00 sec)

3、另一台服务器去测试:

发现能看到copytest数据库:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| copytest           |
+--------------------+
2 rows in set (0.04 sec)

查看一下copytest数据库中的student表:

mysql> use copytest;
Database changed
mysql> select * from student;
+----+------+
| id | name |
+----+------+
|  1 ||
|  2 ||
|  3 ||
+----+------+
3 rows in set (0.04 sec)

修改一下student表:

mysql> update student set name = '小王' where id = 1;
Query OK, 1 row affected (0.04 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from student;
+----+--------+
| id | name   |
+----+--------+
|  1 | 小王   |
|  2 ||
|  3 ||
+----+--------+
3 rows in set (0.04 sec)

那删除一下student表中的数据呢:

mysql> delete from student where id = 1;
ERROR 1142 (42000): DELETE command denied to user 'joytom'@'xxxxxx' for table 'student'

发现没有删除的权限,只能进行查询和修改。

4、在给joytom用户增加一个查看视图的权限

mysql> grant SHOW VIEW on copytest.student to "joytom"@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

之前是只有查询和修改的权限,现在在查看一下:

mysql> show grants for 'joytom'@'%';
+-------------------------------------------------------------------------------------------------------+
| Grants for joytom@%                                                                                   |
+-------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'joytom'@'%' IDENTIFIED BY PASSWORD '*437F1809645E0A92DAB553503D2FE21DB91270FD' |
| GRANT SELECT, UPDATE, SHOW VIEW ON `copytest`.`student` TO 'joytom'@'%'                               |
+-------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

发现,已经有了查看视图的权限。

三、撤销用户权限

老板:咳咳,很好,现在joytom不是有三个权限了么(查询,修改,查询视图),那你把查询视图的权限给去掉,只留查询和修改。

小王心中暗喜,这我都学了,很基础的啊……

1、撤销用户权限命令

revoke privileges ON database.tablename FROM ‘username‘@’host’;

撤销(revoke)的和授予(grant)的基本一样,除了revoke(对应grant)和from(对应to)

2、撤销joytom用户的查看视图的权限

mysql> revoke SHOW VIEW on copytest.student from "joytom"@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

再次查看:

mysql> show grants for 'joytom'@'%';
+-------------------------------------------------------------------------------------------------------+
| Grants for joytom@%                                                                                   |
+-------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'joytom'@'%' IDENTIFIED BY PASSWORD '*437F1809645E0A92DAB553503D2FE21DB91270FD' |
| GRANT SELECT, UPDATE ON `copytest`.`student` TO 'joytom'@'%'                                          |
+-------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

发现已经没了查看视图的权限。

grant, revoke 用户权限后,该用户只有重新连接 MySQL 数据库,权限才能生效。

四、删除一个用户

老板:把joytom这个用户删掉让我看看。

小王:好嘞,40秒完事。

1、删除用户命令

drop user username@host

2、删除用户

先查看一下现在的所有用户:

mysql> select user,host from user;
+----------+---------------+
| user     | host          |
+----------+---------------+
| copytest | %             |
| joytom   | %             |
| test     | %             |
| root     | 127.0.0.1     |
| root     | ::1           |
|          | localhost     |
| root     | localhost     |
|          | vm-8-5-centos |
| root     | vm-8-5-centos |
+----------+---------------+
10 rows in set (0.00 sec)

删除joytom:

mysql> drop user joytom@'%';
Query OK, 0 rows affected (0.00 sec)

再次查看,发现已经没了joytom这个用户:

mysql> select user,host from user;
+----------+---------------+
| user     | host          |
+----------+---------------+
| copytest | %             |
| test     | %             |
| root     | 127.0.0.1     |
| root     | ::1           |
|          | localhost     |
| root     | localhost     |
|          | vm-8-5-centos |
| root     | vm-8-5-centos |
+----------+---------------+
10 rows in set (0.00 sec)

五、修改用户的密码

老板:把joytom这个用户密码修改一下。

小王:好嘞老板。

1、修改用户密码命令

set PASSWORD FOR ‘username‘@’%’ = PASSWORD(‘要修改的密码’)

2、修改用户

SET PASSWORD FOR 'joytom'@'%' = PASSWORD('123123');

六、密码过期和锁定用户

老板大喜:非常好非常好,加薪2k,继续努力,另外给其它同事讲一下密码过期和锁定用户的问题。

感谢老板,我会继续努力,我这就去整理一下课件。

1、关于密码过期

在MySQL5.6.6版本起,增加了password_expired功能,它允许设置MySQL数据库用户的密码过期时间。这个特性已经添加到mysql.user数据表,它的默认值是”N”,表示已禁用密码过期功能

强制设置为密码过期:

mysql> ALTER USER 'joytom'@'%' PASSWORD EXPIRE;
Query OK, 0 rows affected (0.00 sec)

强制设置密码过期后,虽然能够登陆,但是一切权限都为空了。

2、关于mysql5.7锁定用户

在创建的时候锁定用户:

CREATE USER 'username'@'host' account unlock;

已存在的时候锁定用户:

ALTER USER 'joytom'@'%' ACCOUNT LOCK;

解锁账号:

ALTER USER 'joytom'@'%' ACCOUNT UNLOCK

七、权限常用关键字

老板:现在你对mysql的权限管理掌握的还算可以了,咳咳,今天下班前给我整理一个权限常用关键字,整理不好就加会班吧。

小王想,幸亏这个我在学的时候就已经整理过啊,看样今天不用加班了!

在这里插入图片描述

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 2年前 自动加精
讨论数量: 4

很详细 ,学习了

2年前 评论

面向故事授课,生动且形象又具体 :grinning:

2年前 评论

小王,下班给你加个鸡腿🍗

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!