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