大家好,我是路人。
這是 mysql 系列第 3 篇文章。
環境:mysql5.7.25,cmd 命令中進行演示。
在玩 mysql 的過程中,經常遇到有很多朋友在雲上面玩 mysql 的時候,說我創建了一個用戶為什麼不能登錄?為什麼沒有權限?等等各種問題,本文看完之後,這些都不是問題了。
本文主要內容Mysql 權限工作原理mysql 是如何來識別一個用戶的呢?
mysql 為了安全性考慮,採用主機名+用戶名來判斷一個用戶的身份,因為在網際網路中很難通過用戶名來判斷一個用戶的身份,但是我們可以通過 ip 或者主機名判斷一臺機器,某個用戶通過這個機器過來的,我們可以識別為一個用戶,所以mysql 中採用用戶名+主機名來識別用戶的身份。當一個用戶對 mysql 發送指令的時候,mysql 就是通過用戶名和來源(主機)來斷定用戶的權限。
Mysql 權限驗證分為 2 個階段:
階段 1:連接資料庫,此時 mysql 會根據你的用戶名及你的來源(ip 或者主機名稱)判斷是否有權限連接階段 2:對 mysql 伺服器發起請求操作,如 create table、select、delete、update、create index 等操作,此時 mysql 會判斷你是否有權限操作這些指令權限生效時間用戶及權限信息放在庫名為 mysql 的庫中,mysql 啟動時,這些內容被讀進內存並且從此時生效,所以如果通過直接操作這些表來修改用戶及權限信息的,需要重啟mysql或者執行flush privileges;才可以生效。
用戶登錄之後,mysql 會和當前用戶之間創建一個連接,此時用戶相關的權限信息都保存在這個連接中,存放在內存中,此時如果有其他地方修改了當前用戶的權限,這些變更的權限會在下一次登錄時才會生效。
查看 mysql 中所有用戶用戶信息在mysql.user表中,如下:
mysql> use mysql;
Database changed
mysql> select user,host from user;
++----+
| user | host |
++----+
| test4 | 127.0.0.% |
| test4 | 192.168.11.% |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
| test2 | localhost |
++----+
6 rows in set (0.00 sec)
創建用戶語法:
create user 用戶名[@主機名] [identified by '密碼'];說明:
主機名默認值為%,表示這個用戶可以從任何主機連接 mysql 伺服器示例 1:不指定主機名
不指定主機名時,表示這個用戶可以從任何主機連接 mysql 伺服器
mysql> use mysql;
Database changed
mysql> select user,host from user;
++-+
| user | host |
++-+
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
++-+
3 rows in set (0.00 sec)
mysql> create user test1;
Query OK, 0 rows affected (0.00 sec)
mysql> select user,host from user;
++-+
| user | host |
++-+
| test1 | % |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
++-+
4 rows in set (0.00 sec)
mysql> exit
Bye
C:\Users\Think>mysql -utest1
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 49
Server version: 5.7.25-log MySQL Community Server (GPL)
Copyright (c) 2000, 2019, 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.上面創建了用戶名為test1無密碼的用戶,沒有指定主機,可以看出 host 的默認值為%,表示test1可以從任何機器登錄到 mysql 中。
用戶創建之後可以在mysql庫中通過 select user,host from user;查看到。
其他示例
create user 'test2'@'localhost' identified by '123';說明:test2 的主機為 localhost 表示本機,此用戶只能登陸本機的 mysql
create user 'test3'@% identified by '123';說明:test3 可以從任何機器連接到 mysql 伺服器
create user 'test4'@'192.168.11.%' identified by '123';說明:test4 可以從 192.168.11 段的機器連接 mysql
修改密碼【3 種方式】方式 1:通過管理員修改密碼
SET PASSWORD FOR '用戶名'@'主機' = PASSWORD('密碼');方式 2:create user 用戶名[@主機名][identified by '密碼'];
set password = password('密碼');方式 3:通過修改 mysql.user 表修改密碼
use mysql;
update user set authentication_string = password('321') where user = 'test1' and host = '%';
flush privileges;注意:
通過表的方式修改之後,需要執行flush privileges;才能對用戶生效。
5.7 中 user 表中的 authentication_string 欄位表示密碼,老的一些版本中密碼欄位是 password。
給用戶授權創建用戶之後,需要給用戶授權,才有意義。
語法:
grant privileges ON database.table TO 'username'[@'host'] [with grant option]grant 命令說明:
priveleges (權限列表),可以是all,表示所有權限,也可以是select、update等權限,多個權限之間用逗號分開。ON 用來指定權限針對哪些庫和表,格式為資料庫.表名 ,點號前面用來指定資料庫名,點號後面用來指定表名,*.* 表示所有資料庫所有表。TO 表示將權限賦予某個用戶, 格式為username@host,@前面為用戶名,@後面接限制的主機,可以是 IP、IP 段、域名以及%,%表示任何地方。WITH GRANT OPTION 這個選項表示該用戶可以將自己擁有的權限授權給別人。注意:經常有人在創建操作用戶的時候不指定 WITH GRANT OPTION 選項導致後來該用戶不能使用 GRANT 命令創建用戶或者給其它用戶授權。備註:可以使用 GRANT 重複給用戶添加權限,權限疊加,比如你先給用戶添加一個 select 權限,然後又給用戶添加一個 insert 權限,那麼該用戶就同時擁有了 select 和 insert 權限。示例:
grant all on *.* to 'test1'@『%』;說明:給 test1 授權可以操作所有庫所有權限,相當於 dba
grant select on seata.* to 'test1'@'%';說明:test1 可以對 seata 庫中所有的表執行 select
grant select,update on seata.* to 'test1'@'%';說明:test1 可以對 seata 庫中所有的表執行 select、update
grant select(user,host) on mysql.user to 'test1'@'localhost';說明:test1 用戶只能查詢 mysql.user 表的 user,host 欄位
查看用戶有哪些權限show grants for '用戶名'[@'主機']
主機可以省略,默認值為%,示例:
mysql> show grants for 'test1'@'localhost';
+---+
| Grants for test1@localhost |
+---+
| GRANT USAGE ON *.* TO 'test1'@'localhost' |
| GRANT SELECT (host, user) ON `mysql`.`user` TO 'test1'@'localhost' |
+---+
2 rows in set (0.00 sec)show grants;
查看當前用戶的權限,如:
mysql> show grants;
+----+
| Grants for root@localhost |
+----+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT ALL PRIVILEGES ON `test`.* TO 'root'@'localhost' |
| GRANT DELETE ON `seata`.* TO 'root'@'localhost' |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+----+
4 rows in set (0.00 sec)
撤銷用戶的權限語法
revoke privileges ON database.table FROM '用戶名'[@'主機'];可以先通過show grants命令查詢一下用戶對於的權限,然後使用revoke命令撤銷用戶對應的權限,示例:
mysql> show grants for 'test1'@'localhost';
+---+
| Grants for test1@localhost |
+---+
| GRANT USAGE ON *.* TO 'test1'@'localhost' |
| GRANT SELECT (host, user) ON `mysql`.`user` TO 'test1'@'localhost' |
+---+
2 rows in set (0.00 sec)
mysql> revoke select(host) on mysql.user from test1@localhost;
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for 'test1'@'localhost';
+--+
| Grants for test1@localhost |
+--+
| GRANT USAGE ON *.* TO 'test1'@'localhost' |
| GRANT SELECT (user) ON `mysql`.`user` TO 'test1'@'localhost' |
+--+
2 rows in set (0.00 sec)上面我們先通過grants命令查看 test1 的權限,然後調用 revoke 命令撤銷對mysql.user表host欄位的查詢權限,最後又通過 grants 命令查看了 test1 的權限,和預期結果一致。
刪除用戶【2 種方式】方式 1:
drop user '用戶名'[@『主機』],示例:
mysql> drop user test1@localhost;
Query OK, 0 rows affected (0.00 sec)drop 的方式刪除用戶之後,用戶下次登錄就會起效。
方式 2:
通過刪除 mysql.user 表數據的方式刪除,如下:
delete from user where user='用戶名' and host='主機';
flush privileges;注意通過表的方式刪除的,需要調用flush privileges;刷新權限信息(權限啟動的時候在內存中保存著,通過表的方式修改之後需要刷新一下)。
授權原則說明只授予能滿足需要的最小權限,防止用戶幹壞事,比如用戶只是需要查詢,那就只給 select 權限就可以了,不要給用戶賦予 update、insert 或者 delete 權限創建用戶的時候限制用戶的登錄主機,一般是限制成指定 IP 或者內網 IP 段初始化資料庫的時候刪除沒有密碼的用戶,安裝完資料庫的時候會自動創建一些用戶,這些用戶默認沒有密碼總結通過命令的方式操作用戶和權限不需要刷新,下次登錄自動生效通過操作 mysql 庫中表的方式修改、用戶信息,需要調用flush privileges;刷新一下,下次登錄自動生效本文中講到的一些指令中帶主機的,主機都可以省略,默認值為%,表示所有機器mysql 中用戶和權限的信息在庫名為 mysql 的庫中mysql 系列大概有 20 多篇,喜歡的請關注一下!
最新資料