淺談MySQL權(quán)限管理

在我們安裝完數(shù)據(jù)庫后,只能在本地登錄數(shù)據(jù)庫,當(dāng)進(jìn)行遠(yuǎn)程登錄時(shí),會(huì)提示我們錯(cuò)誤。這時(shí),我們就要進(jìn)行相應(yīng)的配置,給特定的用戶賦予特定的操作權(quán)限。MySQL中使用GRANT命令和REVOKE命令來管理用戶的權(quán)限。

查看用戶的權(quán)限:
(1):查看當(dāng)前用戶的所有權(quán)限(示例中使用root用戶登錄),使用show grants命令:

mysql> show grants \G
*************************** 1. row ***************************
Grants for root@localhost: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `root`@`localhost` WITH GRANT OPTION
*************************** 2. row ***************************
Grants for root@localhost: GRANT BACKUP_ADMIN,BINLOG_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,GROUP_REPLICATION_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SET_USER_ID,SYSTEM_VARIABLES_ADMIN,XA_RECOVER_ADMIN ON *.* TO `root`@`localhost` WITH GRANT OPTION
*************************** 3. row ***************************
Grants for root@localhost: GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION
3 rows in set (0.00 sec)

(2):查看指定用戶的所有權(quán)限,使用show grants for 'user'@'ip地址段'命令:

mysql> show grants for 'compony'@'192.168.0.1' \G
*************************** 1. row ***************************
Grants for 'compony'@'192.168.0.1': GRANT USAGE ON *.* TO `compony`@`192.168.0.1`
*************************** 2. row ***************************
Grants for 'compony'@'192.168.0.1': GRANT SELECT ON `noteclass`.* TO `compony`@`192.168.0.1`
2 rows in set (0.00 sec)

上面表示compony用戶在192.168.0.1網(wǎng)絡(luò)地址登錄本機(jī)MySQL后,對(duì)noteclass數(shù)據(jù)庫具有select權(quán)限。

使用GRANT命令進(jìn)行授權(quán):
grant語法

grant 權(quán)限 on 數(shù)據(jù)庫.數(shù)據(jù)表 to 用戶名@IP地址 identified by '密碼' with grant option;
//例如
grant all privileges on *.* to 'user'@'192.168.0.1' identified by '123456' with grant option;

權(quán)限包括select、update、delete、insert等,詳情請(qǐng)參考MySQL官方網(wǎng)站,傳送門:https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html
on:表示這些權(quán)限對(duì)哪些數(shù)據(jù)庫和表生效
to:權(quán)限授予的對(duì)象
identified by:設(shè)置用戶的登錄密碼
with grant option:表示允許用戶將自己的權(quán)限授予給其他用戶
grant命令只能對(duì)已存在的用戶生效,如果授權(quán)的用戶不存在,則會(huì)出現(xiàn)如下錯(cuò)誤:

mysql> grant all on noteclass.* to shi@'192.168.0.1' identified by '123456';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'identified by '123456'' at line 1

使用grant命令給用戶授予權(quán)限,權(quán)限會(huì)自動(dòng)疊加而不是覆蓋。在授權(quán)后,不要忘了執(zhí)行命令更新權(quán)限表。

full privileges;

使用revoke命令收回授權(quán)
revoke命令語法跟grant命令差不多,只需把關(guān)鍵字to換成from即可,并且不需要設(shè)置密碼。revoke可以收回所有權(quán)限,也可以收回部分權(quán)限,示例代碼如下:

mysql> revoke all privileges on *.* from 'compony'@'192.168.1.0';              
mysql> revoke insert,select,update,delete,drop,create,alter on huanqiu.* from 'compony'@'192.168.0.1';
mysql> flush privileges 

mysql授權(quán)表一共涉及到5個(gè)表,分別是user、db、host、tables_priv和columns_priv。
這5張表的內(nèi)容和用途如下:
1)user表
user表列出可以連接服務(wù)器的用戶及其口令,并且它指定他們有哪種全局(超級(jí)用戶)權(quán)限。在user表啟用的任何權(quán)限均是全局權(quán)限,并適用于所有數(shù)據(jù)庫。例如,如果你啟用了DELETE權(quán)限,在這里列出的用戶可以從任何表中刪除記錄,所以在你這樣做之前要認(rèn)真考慮。
2)db表
db表列出數(shù)據(jù)庫,而用戶有權(quán)限訪問它們。在這里指定的權(quán)限適用于一個(gè)數(shù)據(jù)庫中的所有表。
3)host表
host表與db表結(jié)合使用在一個(gè)較好層次上控制特定主機(jī)對(duì)數(shù)據(jù)庫的訪問權(quán)限,這可能比單獨(dú)使用db好些。這個(gè)表不受GRANT和REVOKE語句的影響,所以,你可能發(fā)覺你根本不是用它。
4)tables_priv表
tables_priv表指定表級(jí)權(quán)限,在這里指定的一個(gè)權(quán)限適用于一個(gè)表的所有列。
5)columns_priv表
columns_priv表指定列級(jí)權(quán)限。這里指定的權(quán)限適用于一個(gè)表的特定列。

問題解決:
在配置MySQL遠(yuǎn)程連接的過程中,可能存在Navicat無法連接的狀況,造成這種狀況的原因很有可能是MySQL的加密規(guī)則不一樣,檢索user表中的信息,如下:

mysql> select User,Host,plugin from user;
+------------------+----------------+-----------------------+
| User             | Host           | plugin                |
+------------------+----------------+-----------------------+
| compony          | 221.217.88.214 | mysql_native_password |
| mysql.infoschema | localhost      | caching_sha2_password |
| mysql.session    | localhost      | caching_sha2_password |
| mysql.sys        | localhost      | caching_sha2_password |
| root             | localhost      | caching_sha2_password |
+------------------+----------------+-----------------------+
5 rows in set (0.00 sec)

MySQL8默認(rèn)的加密方式改為了caching_sha2_password,我們需要把這個(gè)改為mysql_native_password。修改方法如下:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密碼';

或者在創(chuàng)建用戶時(shí)直接指定加密規(guī)則:

CREATE USER 'user_name'@'192.168.0.1' IDENTIFIED WITH 'mysql_native_password' BY 'password';

也可以升級(jí)客戶端修復(fù)上面的問題。

在授權(quán)時(shí),還可能存在下面的情況,提示信息為You are not allowed to create a user with GRANT,造成該問題的的原因是授權(quán)語句中的IP地址寫成了%,網(wǎng)上很多教程說%是通配所有的Host,但是在MySQL8中引起錯(cuò)誤,具體原因不算太清楚,可能是新版本做了一些修改,如果有了解的可以分享一下。解決這個(gè)問題的辦法就是把這個(gè)%換成用戶在user表中對(duì)應(yīng)的Host,更改過后使用flush privileges命令刷新一下權(quán)限即可。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容