老闆:讓你新增一個mysql使用者並給予許可權這麼費勁嗎?

tomlibao發表於2021-06-11

在這裡插入圖片描述

今天,程式設計師小王被老闆訓了一頓,還被扣了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 協議》,轉載必須註明作者和本文連結

相關文章