MySQL如何進(jìn)行權(quán)限管理?

本篇文章給大家?guī)?lái)的內(nèi)容是介紹mysql如何進(jìn)行權(quán)限管理?有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。

mysql 的權(quán)限表在數(shù)據(jù)庫(kù)啟動(dòng)的時(shí)候就載入內(nèi)存,當(dāng)用戶通過(guò)身份認(rèn)證后,就在內(nèi)存中進(jìn)行相應(yīng)權(quán)限的存取,這樣,此用戶就可以在數(shù)據(jù)庫(kù)中做權(quán)限范圍內(nèi)的各種操作了。【視頻教程推薦:MySQL 教程

一、權(quán)限表的存取

在權(quán)限存取的兩個(gè)過(guò)程中,系統(tǒng)會(huì)用到 “mysql” 數(shù)據(jù)庫(kù)(安裝 MySQL 時(shí)被創(chuàng)建,數(shù)據(jù)庫(kù)名稱叫“mysql”) 中 user、host 和 db 這3個(gè)最重要的權(quán)限表。

在這 3 個(gè)表中,最重要的表示 user 表,其次是 db 表,host 表在大多數(shù)情況下并不使用。

user 中的列主要分為 4 個(gè)部分:用戶列、權(quán)限列、安全列和資源控制列。

通常用的最多的是用戶列和權(quán)限列,其中權(quán)限列又分為普通權(quán)限和管理權(quán)限。普通權(quán)限用于數(shù)據(jù)庫(kù)的操作,比如 select_priv、super_priv 等。

當(dāng)用戶進(jìn)行連接時(shí),權(quán)限表的存取過(guò)程有以下兩個(gè)過(guò)程:

  • 先從 user 表中的 host、user 和 password 這 3 個(gè)字段中判斷連接的 IP、用戶名、和密碼是否存在于表中,如果存在,則通過(guò)身份驗(yàn)證,否則拒絕連接。

  • 如果通過(guò)身份驗(yàn)證、則按照以下權(quán)限表的順序得到數(shù)據(jù)庫(kù)權(quán)限:user -> db -> tables_priv -> columns_priv。

在這幾個(gè)權(quán)限表中,權(quán)限范圍依次遞減,全局權(quán)限覆蓋局部權(quán)限。上面的第一階段好理解,下面以一個(gè)例子來(lái)詳細(xì)解釋一下第二階段。 ?
為了方便測(cè)試,需要修改變量 sql_mode

// sql_mode 默認(rèn)值中有 NO_AUTO_CREATE_USER (防止GRANT自動(dòng)創(chuàng)建新用戶,除非還指定了密碼) SET SESSION sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';

1. 創(chuàng)建用戶 zj@localhost,并賦予所有數(shù)據(jù)庫(kù)上的所有表的 select 權(quán)限

MySQL [mysql]> grant select on *.* to zj@localhost; Query OK, 0 rows affected, 2 warnings (0.00 sec)  MySQL [mysql]> select * from user where user="zj" and host='localhost' G; *************************** 1. row ***************************                   Host: localhost                   User: zj            Select_priv: Y            Insert_priv: N            Update_priv: N            delete_priv: N            Create_priv: N              Drop_priv: N            Reload_priv: N ...

2. 查看 db 表

MySQL [mysql]> select * from db where user='zj' G ; Empty set (0.00 sec)

可以發(fā)現(xiàn),user 表的 select_priv 列是 “Y”,而 db 表中并沒(méi)有記錄,也就是說(shuō),對(duì)所有數(shù)據(jù)庫(kù)都具有相同的權(quán)限的用戶并不需要記錄到 db 表,而僅僅需要將 user 表中的 select_priv 改為 “Y” 即可。換句話說(shuō),user 表中的每個(gè)權(quán)限都代表了對(duì)所有數(shù)據(jù)庫(kù)都有權(quán)限。

3. 將 zj@localhost 上的權(quán)限改為只對(duì) t2 數(shù)據(jù)庫(kù)上所有表的 select 權(quán)限。

MySQL [mysql]> revoke select on *.* from zj@localhost; Query OK, 0 rows affected, 1 warning (0.02 sec)  MySQL [mysql]> grant select on t2.* to zj@localhost; Query OK, 0 rows affected, 1 warning (0.04 sec)  MySQL [mysql]> select * from user where user='zj' G; *************************** 1. row ***************************                   Host: localhost                   User: zj            Select_priv: N            Insert_priv: N            Update_priv: N            Delete_priv: N            Create_priv: N              Drop_priv: N            Reload_priv: N ...  MySQL [mysql]> select * from db where user='zj' G; *************************** 1. row ***************************                  Host: localhost                    Db: t2                  User: zj           Select_priv: Y           Insert_priv: N           Update_priv: N           Delete_priv: N           Create_priv: N             Drop_priv: N            Grant_priv: N

這時(shí)候發(fā)現(xiàn),user 表中的 select_priv 變?yōu)?“N” ,而 db 表中增加了 db 為 t2 的一條記錄。也就是說(shuō),當(dāng)只授予部分?jǐn)?shù)據(jù)庫(kù)某些權(quán)限時(shí),user 表中的相應(yīng)權(quán)限列保持 “N”,而將具體的數(shù)據(jù)庫(kù)權(quán)限寫(xiě)入 db 表。table 和 column 的權(quán)限機(jī)制和 db 類似。

從上例可以看出,當(dāng)用戶通過(guò)權(quán)限認(rèn)證,進(jìn)行權(quán)限分配時(shí),將按照 user -> db -> tables_priv -> columns_priv 的順序進(jìn)行權(quán)限分配,即先檢查全局權(quán)限表 user,如果 user 中對(duì)應(yīng) 權(quán)限為 “Y”,則此用戶對(duì)所有數(shù)據(jù)庫(kù)的權(quán)限都為“Y”,將不再檢查 db、tables_priv 和 columns_priv;如果為“N”,則到 db 表中檢查此用戶對(duì)應(yīng)的具體數(shù)據(jù)庫(kù),并得到 db 中為 “Y”的權(quán)限;如果 db 中相應(yīng)權(quán)限為 “N”,則再依次檢查tables_priv 和 columns_priv 中的權(quán)限,如果所有的都為“N”,則判斷為不具備權(quán)限。

二、賬號(hào)管理

主要包括賬號(hào)的創(chuàng)建,權(quán)限的更改和賬號(hào)的刪除。

1. 創(chuàng)建賬號(hào)

使用 grant 語(yǔ)法創(chuàng)建,示例:

(1) 創(chuàng)建用戶 zj ,權(quán)限為可以在所有數(shù)據(jù)庫(kù)上執(zhí)行所有權(quán)限,只能從本地進(jìn)行連接。
MySQL [mysql]> grant all privileges on *.* to zj@localhost; Query OK, 0 rows affected, 2 warnings (0.00 sec)  MySQL [mysql]> select * from user where user="zj" and host="localhost" G; *************************** 1. row ***************************                   Host: localhost                   User: zj            Select_priv: Y            Insert_priv: Y            Update_priv: Y            Delete_priv: Y            Create_priv: Y              Drop_priv: Y            Reload_priv: Y          Shutdown_priv: Y

可以發(fā)現(xiàn),除了 grant_priv 權(quán)限外,所有權(quán)限在 user 表里面都是 “Y”。

(2) 在 (1) 基礎(chǔ)上,增加對(duì) zj 的 grant 權(quán)限
MySQL [(none)]> grant all privileges on *.* to zj@localhost with grant option; Query OK, 0 rows affected, 1 warning (0.01 sec)  MySQL [mysql]> select * from user where user="zj" and host='localhost' G ; *************************** 1. row ***************************                   Host: localhost                   User: zj            Select_priv: Y            Insert_priv: Y            Update_priv: Y            Delete_priv: Y            Create_priv: Y              Drop_priv: Y            Reload_priv: Y          Shutdown_priv: Y           Process_priv: Y              File_priv: Y             Grant_priv: Y ...
(3) 在 (2) 基礎(chǔ)上,設(shè)置密碼為 “123”
MySQL [mysql]> grant all  privileges on *.* to zj@localhost identified by '123' with grant option; Query OK, 0 rows affected, 2 warnings (0.01 sec)  MySQL [mysql]> select * from user where user="zj" and host="localhost" G ; *************************** 1. row ***************************                   Host: localhost                   User: zj            Select_priv: Y            Insert_priv: Y            Update_priv: Y            Delete_priv: Y            Create_priv: Y              Drop_priv: Y            Reload_priv: Y ......    authentication_string: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257       password_expired: N  password_last_changed: 2017-09-25 20:29:42      password_lifetime: NULL

可以發(fā)現(xiàn),密碼變成了一加密后的字符串。

(4) 創(chuàng)建新用戶 zj2,可以從任何 IP 連接,權(quán)限為對(duì) t2 數(shù)據(jù)庫(kù)里的所有表進(jìn)行 select 、update、insert 和 delete 操作,初始密碼為“123”
MySQL [mysql]> grant select ,insert, update,delete on t2.* to 'zj2'@'%' identified by '123'; Query OK, 0 rows affected, 1 warning (0.00 sec)  MySQL [mysql]> select * from user where user='zj2' and host="%" G; *************************** 1. row ***************************                   Host: %                   User: zj2            Select_priv: N            Insert_priv: N            Update_priv: N            Delete_priv: N            Create_priv: N              Drop_priv: N ......  authentication_string: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257       password_expired: N  password_last_changed: 2017-09-25 20:37:49      password_lifetime: NULL  MySQL [mysql]> select * from db where user="zj2" and host='%' G; *************************** 1. row ***************************                  Host: %                    Db: t2                  User: zj2           Select_priv: Y           Insert_priv: Y           Update_priv: Y           Delete_priv: Y           Create_priv: N             Drop_priv: N ......

user 表中的權(quán)限都是“N”,db 表中增加的記錄權(quán)限則都是“Y”。一般的,只授予用戶適當(dāng)?shù)臋?quán)限,而不會(huì)授予過(guò)多的權(quán)限。

本例中的 IP 限制為所有 IP 都可以連接,因此設(shè)置為 “*”,mysql 數(shù)據(jù)庫(kù)中是通過(guò) user 表的 host 字段來(lái)進(jìn)行控制,host 可以是以下類型的賦值。

  • Host 值可以是主機(jī)名或IP號(hào),或 “l(fā)ocalhost” 指出本地主機(jī)。

  • 可以在 Host 列值使用通配符字符 “%” 和 “_”

  • Host 值 “%” 匹配任何主機(jī)名,空 Host 值等價(jià)于 “%”,它們的含義與 like 操作符的模式匹配操作相同。

注意: mysql 數(shù)據(jù)庫(kù)的 user 表中 host 的值為 “*” 或者空,表示所有外部 IP 都可以連接,但是不包括本地服務(wù)器 localhost,因此,如果要包括本地服務(wù)器,必須單獨(dú)為 localhost 賦予權(quán)限。

(5) 授予 super、process、file 權(quán)限給用戶 zj3@%
MySQL [mysql]> grant super,process,file on *.* to 'zj3'@'%'; Query OK, 0 rows affected, 1 warning (0.00 sec)

因?yàn)檫@幾個(gè)權(quán)限都是屬于管理權(quán)限,因此不能夠指定某個(gè)數(shù)據(jù)庫(kù),on 后面必須跟 “.”,下面語(yǔ)法將提示錯(cuò)誤

MySQL [mysql]> grant super,process,file on t2.* to 'zj3'@'%'; ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
(6) 只授予登錄權(quán)限給 zj4@localhost
MySQL [mysql]> grant usage on *.* to 'zj4'@'localhost'; Query OK, 0 rows affected, 2 warnings (0.01 sec)  MySQL [mysql]> exit Bye  zj@bogon:~$ mysql -uzj4 -p Enter password:  Welcome to the MySQL monitor.  Commands end with ; or g. Your MySQL connection id is 78 Server version: 5.7.18-log Source distribution  Copyright (c) 2000, 2017, 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 [(none)]> show databases; +--------------------+ | Database           | +--------------------+ | information_schema | +--------------------+ 1 row in set (0.02 sec)

usage 權(quán)限只能用于數(shù)據(jù)庫(kù)登錄,不能執(zhí)行任何操作

2. 查看賬號(hào)權(quán)限

賬號(hào)創(chuàng)建好后,可以通過(guò)如下命令查看權(quán)限:

show grants for user@host;

示例:

MySQL [(none)]> show grants for zj@localhost; +-------------------------------------------------------------------+ | Grants for zj@localhost                                           | +-------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'zj'@'localhost' WITH GRANT OPTION | +-------------------------------------------------------------------+ 1 row in set (0.01 sec)

3. 更改賬號(hào)權(quán)限

可以進(jìn)行權(quán)限的新增和回收。和創(chuàng)建賬號(hào)一樣,權(quán)限變更也有兩種方法:使用 grant(新增) 和 revoke (回收) 語(yǔ)句,或者更改權(quán)限表。

示例:
(1) zj4@localhost 目前只有登錄權(quán)限
MySQL [(none)]> show grants for zj4@localhost; +-----------------------------------------+ | Grants for zj4@localhost                | +-----------------------------------------+ | GRANT USAGE ON *.* TO 'zj4'@'localhost' | +-----------------------------------------+ 1 row in set (0.00 sec)
(2) 賦予 zj4@localhost 所有數(shù)據(jù)庫(kù)上的所有表的 select 權(quán)限
MySQL [(none)]> grant select on *.* to 'zj4'@'localhost'; Query OK, 0 rows affected, 1 warning (0.00 sec)  MySQL [(none)]> show grants for zj4@localhost; +------------------------------------------+ | Grants for zj4@localhost                 | +------------------------------------------+ | GRANT SELECT ON *.* TO 'zj4'@'localhost' | +------------------------------------------+ 1 row in set (0.00 sec)
(3) 繼續(xù)給 zj4@localhost 賦予 select 和 insert 權(quán)限,和已有的 select 權(quán)限進(jìn)行合并
MySQL [(none)]> show grants for 'zj4'@'localhost'; +--------------------------------------------------+ | Grants for zj4@localhost                         | +--------------------------------------------------+ | GRANT SELECT, INSERT ON *.* TO 'zj4'@'localhost' | +--------------------------------------------------+ 1 row in set (0.00 sec)

revoke 語(yǔ)句可以回收已經(jīng)賦予的權(quán)限,對(duì)于上面的例子,這里決定要收回 zj4@localhost 上的 insert 和 select 權(quán)限:

MySQL [(none)]> revoke select,insert on *.* from zj4@localhost; Query OK, 0 rows affected, 1 warning (0.00 sec)  MySQL [(none)]> show grants for zj4@localhost; +-----------------------------------------+ | Grants for zj4@localhost                | +-----------------------------------------+ | GRANT USAGE ON *.* TO 'zj4'@'localhost' | +-----------------------------------------+ 1 row in set (0.00 sec)

usage 權(quán)限不能被回收,也就是說(shuō),revoke 用戶并不能刪除用戶。

4. 修改賬號(hào)密碼

(1) 可以用 mysqladmin 命令在命令行指定密碼。
shell> mysqladmin -u user_name -h host_name password "123456"
(2) 執(zhí)行 set password 語(yǔ)句。
mysql> set password for 'username'@'%' = password('pwd');

如果是更改自己的密碼,可以省略 for 語(yǔ)句

mysql> set password=password('pwd');
(3) 可以在全局級(jí)別使用 grant usage 語(yǔ)句(在“.”)來(lái)指定某個(gè)賬戶的密碼而不影響賬戶當(dāng)前的權(quán)限。
mysql> grant usage on *.* to 'username'@'%' identified by 'pwd';

5. 刪除賬號(hào)

要徹底的刪除賬號(hào),可以使用 drop user :

drop user zj@localhost;

6. 賬號(hào)資源限制

創(chuàng)建 MySQL 賬號(hào)時(shí),還有一類選項(xiàng)稱為賬號(hào)資源限制,這類選項(xiàng)的作用是限制每個(gè)賬號(hào)實(shí)際具有的資源限制,這里的“資源”主要包括:

  • max_queries_per_hour count : 單個(gè)賬號(hào)每小時(shí)執(zhí)行的查詢次數(shù)

  • max_upodates_per_hour count : 單個(gè)賬號(hào)每小時(shí)執(zhí)行的更新次數(shù)

  • max_connections_per_hour count : 單個(gè)賬號(hào)每小時(shí)連接服務(wù)器的次數(shù)

  • max_user_connections count : 單個(gè)賬號(hào)并發(fā)連接服務(wù)器的次數(shù)

  1. 專欄

  2. 落棋不悔

  3. 文章詳情

MySQL如何進(jìn)行權(quán)限管理? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

waterandair ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?MySQL如何進(jìn)行權(quán)限管理?955 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?發(fā)布于 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?落棋不悔 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2017-10-30 發(fā)布 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

MySQL 權(quán)限管理

  • 權(quán)限控制

  • MySQL如何進(jìn)行權(quán)限管理? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?mysql

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1.5k 次閱讀 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??·? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?讀完需要 38 分鐘 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ? ?4 ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

MySQL 的權(quán)限表在數(shù)據(jù)庫(kù)啟動(dòng)的時(shí)候就載入內(nèi)存,當(dāng)用戶通過(guò)身份認(rèn)證后,就在內(nèi)存中進(jìn)行相應(yīng)權(quán)限的存取,這樣,此用戶就可以在數(shù)據(jù)庫(kù)中做權(quán)限范圍內(nèi)的各種操作了。

一、權(quán)限表的存取

在權(quán)限存取的兩個(gè)過(guò)程中,系統(tǒng)會(huì)用到 “mysql” 數(shù)據(jù)庫(kù)(安裝 MySQL 時(shí)被創(chuàng)建,數(shù)據(jù)庫(kù)名稱叫“mysql”) 中 user、host 和 db 這3個(gè)最重要的權(quán)限表。

在這 3 個(gè)表中,最重要的表示 user 表,其次是 db 表,host 表在大多數(shù)情況下并不使用。

user 中的列主要分為 4 個(gè)部分:用戶列、權(quán)限列、安全列和資源控制列。

通常用的最多的是用戶列和權(quán)限列,其中權(quán)限列又分為普通權(quán)限和管理權(quán)限。普通權(quán)限用于數(shù)據(jù)庫(kù)的操作,比如 select_priv、super_priv 等。

當(dāng)用戶進(jìn)行連接時(shí),權(quán)限表的存取過(guò)程有以下兩個(gè)過(guò)程:

  • 先從 user 表中的 host、user 和 password 這 3 個(gè)字段中判斷連接的 IP、用戶名、和密碼是否存在于表中,如果存在,則通過(guò)身份驗(yàn)證,否則拒絕連接。

  • 如果通過(guò)身份驗(yàn)證、則按照以下權(quán)限表的順序得到數(shù)據(jù)庫(kù)權(quán)限:user -> db -> tables_priv -> columns_priv。

在這幾個(gè)權(quán)限表中,權(quán)限范圍依次遞減,全局權(quán)限覆蓋局部權(quán)限。上面的第一階段好理解,下面以一個(gè)例子來(lái)詳細(xì)解釋一下第二階段。 ?
為了方便測(cè)試,需要修改變量 sql_mode

// sql_mode 默認(rèn)值中有 NO_AUTO_CREATE_USER (防止GRANT自動(dòng)創(chuàng)建新用戶,除非還指定了密碼) SET SESSION sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';

1. 創(chuàng)建用戶 zj@localhost,并賦予所有數(shù)據(jù)庫(kù)上的所有表的 select 權(quán)限

MySQL [mysql]> grant select on *.* to zj@localhost; Query OK, 0 rows affected, 2 warnings (0.00 sec)  MySQL [mysql]> select * from user where user="zj" and host='localhost' G; *************************** 1. row ***************************                   Host: localhost                   User: zj            Select_priv: Y            Insert_priv: N            Update_priv: N            Delete_priv: N            Create_priv: N              Drop_priv: N            Reload_priv: N ...

2. 查看 db 表

MySQL [mysql]> select * from db where user='zj' G ; Empty set (0.00 sec)

可以發(fā)現(xiàn),user 表的 select_priv 列是 “Y”,而 db 表中并沒(méi)有記錄,也就是說(shuō),對(duì)所有數(shù)據(jù)庫(kù)都具有相同的權(quán)限的用戶并不需要記錄到 db 表,而僅僅需要將 user 表中的 select_priv 改為 “Y” 即可。換句話說(shuō),user 表中的每個(gè)權(quán)限都代表了對(duì)所有數(shù)據(jù)庫(kù)都有權(quán)限。

3. 將 zj@localhost 上的權(quán)限改為只對(duì) t2 數(shù)據(jù)庫(kù)上所有表的 select 權(quán)限。

MySQL [mysql]> revoke select on *.* from zj@localhost; Query OK, 0 rows affected, 1 warning (0.02 sec)  MySQL [mysql]> grant select on t2.* to zj@localhost; Query OK, 0 rows affected, 1 warning (0.04 sec)  MySQL [mysql]> select * from user where user='zj' G; *************************** 1. row ***************************                   Host: localhost                   User: zj            Select_priv: N            Insert_priv: N            Update_priv: N            Delete_priv: N            Create_priv: N              Drop_priv: N            Reload_priv: N ...  MySQL [mysql]> select * from db where user='zj' G; *************************** 1. row ***************************                  Host: localhost                    Db: t2                  User: zj           Select_priv: Y           Insert_priv: N           Update_priv: N           Delete_priv: N           Create_priv: N             Drop_priv: N            Grant_priv: N

這時(shí)候發(fā)現(xiàn),user 表中的 select_priv 變?yōu)?“N” ,而 db 表中增加了 db 為 t2 的一條記錄。也就是說(shuō),當(dāng)只授予部分?jǐn)?shù)據(jù)庫(kù)某些權(quán)限時(shí),user 表中的相應(yīng)權(quán)限列保持 “N”,而將具體的數(shù)據(jù)庫(kù)權(quán)限寫(xiě)入 db 表。table 和 column 的權(quán)限機(jī)制和 db 類似。

從上例可以看出,當(dāng)用戶通過(guò)權(quán)限認(rèn)證,進(jìn)行權(quán)限分配時(shí),將按照 user -> db -> tables_priv -> columns_priv 的順序進(jìn)行權(quán)限分配,即先檢查全局權(quán)限表 user,如果 user 中對(duì)應(yīng) 權(quán)限為 “Y”,則此用戶對(duì)所有數(shù)據(jù)庫(kù)的權(quán)限都為“Y”,將不再檢查 db、tables_priv 和 columns_priv;如果為“N”,則到 db 表中檢查此用戶對(duì)應(yīng)的具體數(shù)據(jù)庫(kù),并得到 db 中為 “Y”的權(quán)限;如果 db 中相應(yīng)權(quán)限為 “N”,則再依次檢查tables_priv 和 columns_priv 中的權(quán)限,如果所有的都為“N”,則判斷為不具備權(quán)限。

二、賬號(hào)管理

主要包括賬號(hào)的創(chuàng)建,權(quán)限的更改和賬號(hào)的刪除。

1. 創(chuàng)建賬號(hào)

使用 grant 語(yǔ)法創(chuàng)建,示例:

(1) 創(chuàng)建用戶 zj ,權(quán)限為可以在所有數(shù)據(jù)庫(kù)上執(zhí)行所有權(quán)限,只能從本地進(jìn)行連接。
MySQL [mysql]> grant all privileges on *.* to zj@localhost; Query OK, 0 rows affected, 2 warnings (0.00 sec)  MySQL [mysql]> select * from user where user="zj" and host="localhost" G; *************************** 1. row ***************************                   Host: localhost                   User: zj            Select_priv: Y            Insert_priv: Y            Update_priv: Y            Delete_priv: Y            Create_priv: Y              Drop_priv: Y            Reload_priv: Y          Shutdown_priv: Y

可以發(fā)現(xiàn),除了 grant_priv 權(quán)限外,所有權(quán)限在 user 表里面都是 “Y”。

(2) 在 (1) 基礎(chǔ)上,增加對(duì) zj 的 grant 權(quán)限
MySQL [(none)]> grant all privileges on *.* to zj@localhost with grant option; Query OK, 0 rows affected, 1 warning (0.01 sec)  MySQL [mysql]> select * from user where user="zj" and host='localhost' G ; *************************** 1. row ***************************                   Host: localhost                   User: zj            Select_priv: Y            Insert_priv: Y            Update_priv: Y            Delete_priv: Y            Create_priv: Y              Drop_priv: Y            Reload_priv: Y          Shutdown_priv: Y           Process_priv: Y              File_priv: Y             Grant_priv: Y ...
(3) 在 (2) 基礎(chǔ)上,設(shè)置密碼為 “123”
MySQL [mysql]> grant all  privileges on *.* to zj@localhost identified by '123' with grant option; Query OK, 0 rows affected, 2 warnings (0.01 sec)  MySQL [mysql]> select * from user where user="zj" and host="localhost" G ; *************************** 1. row ***************************                   Host: localhost                   User: zj            Select_priv: Y            Insert_priv: Y            Update_priv: Y            Delete_priv: Y            Create_priv: Y              Drop_priv: Y            Reload_priv: Y ......    authentication_string: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257       password_expired: N  password_last_changed: 2017-09-25 20:29:42      password_lifetime: NULL

可以發(fā)現(xiàn),密碼變成了一堆加密后的字符串。

(4) 創(chuàng)建新用戶 zj2,可以從任何 IP 連接,權(quán)限為對(duì) t2 數(shù)據(jù)庫(kù)里的所有表進(jìn)行 select 、update、insert 和 delete 操作,初始密碼為“123”
MySQL [mysql]> grant select ,insert, update,delete on t2.* to 'zj2'@'%' identified by '123'; Query OK, 0 rows affected, 1 warning (0.00 sec)  MySQL [mysql]> select * from user where user='zj2' and host="%" G; *************************** 1. row ***************************                   Host: %                   User: zj2            Select_priv: N            Insert_priv: N            Update_priv: N            Delete_priv: N            Create_priv: N              Drop_priv: N ......  authentication_string: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257       password_expired: N  password_last_changed: 2017-09-25 20:37:49      password_lifetime: NULL  MySQL [mysql]> select * from db where user="zj2" and host='%' G; *************************** 1. row ***************************                  Host: %                    Db: t2                  User: zj2           Select_priv: Y           Insert_priv: Y           Update_priv: Y           Delete_priv: Y           Create_priv: N             Drop_priv: N ......

user 表中的權(quán)限都是“N”,db 表中增加的記錄權(quán)限則都是“Y”。一般的,只授予用戶適當(dāng)?shù)臋?quán)限,而不會(huì)授予過(guò)多的權(quán)限。

本例中的 IP 限制為所有 IP 都可以連接,因此設(shè)置為 “*”,mysql 數(shù)據(jù)庫(kù)中是通過(guò) user 表的 host 字段來(lái)進(jìn)行控制,host 可以是以下類型的賦值。

  • Host 值可以是主機(jī)名或IP號(hào),或 “l(fā)ocalhost” 指出本地主機(jī)。

  • 可以在 Host 列值使用通配符字符 “%” 和 “_”

  • Host 值 “%” 匹配任何主機(jī)名,空 Host 值等價(jià)于 “%”,它們的含義與 like 操作符的模式匹配操作相同。

注意: mysql 數(shù)據(jù)庫(kù)的 user 表中 host 的值為 “*” 或者空,表示所有外部 IP 都可以連接,但是不包括本地服務(wù)器 localhost,因此,如果要包括本地服務(wù)器,必須單獨(dú)為 localhost 賦予權(quán)限。

(5) 授予 super、process、file 權(quán)限給用戶 zj3@%
MySQL [mysql]> grant super,process,file on *.* to 'zj3'@'%'; Query OK, 0 rows affected, 1 warning (0.00 sec)

因?yàn)檫@幾個(gè)權(quán)限都是屬于管理權(quán)限,因此不能夠指定某個(gè)數(shù)據(jù)庫(kù),on 后面必須跟 “.”,下面語(yǔ)法將提示錯(cuò)誤

MySQL [mysql]> grant super,process,file on t2.* to 'zj3'@'%'; ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
(6) 只授予登錄權(quán)限給 zj4@localhost
MySQL [mysql]> grant usage on *.* to 'zj4'@'localhost'; Query OK, 0 rows affected, 2 warnings (0.01 sec)  MySQL [mysql]> exit Bye  zj@bogon:~$ mysql -uzj4 -p Enter password:  Welcome to the MySQL monitor.  Commands end with ; or g. Your MySQL connection id is 78 Server version: 5.7.18-log Source distribution  Copyright (c) 2000, 2017, 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 [(none)]> show databases; +--------------------+ | Database           | +--------------------+ | information_schema | +--------------------+ 1 row in set (0.02 sec)

usage 權(quán)限只能用于數(shù)據(jù)庫(kù)登錄,不能執(zhí)行任何操作

2. 查看賬號(hào)權(quán)限

賬號(hào)創(chuàng)建好后,可以通過(guò)如下命令查看權(quán)限:

show grants for user@host;

示例:

MySQL [(none)]> show grants for zj@localhost; +-------------------------------------------------------------------+ | Grants for zj@localhost                                           | +-------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'zj'@'localhost' WITH GRANT OPTION | +-------------------------------------------------------------------+ 1 row in set (0.01 sec)

3. 更改賬號(hào)權(quán)限

可以進(jìn)行權(quán)限的新增和回收。和創(chuàng)建賬號(hào)一樣,權(quán)限變更也有兩種方法:使用 grant(新增) 和 revoke (回收) 語(yǔ)句,或者更改權(quán)限表。

示例:
(1) zj4@localhost 目前只有登錄權(quán)限
MySQL [(none)]> show grants for zj4@localhost; +-----------------------------------------+ | Grants for zj4@localhost                | +-----------------------------------------+ | GRANT USAGE ON *.* TO 'zj4'@'localhost' | +-----------------------------------------+ 1 row in set (0.00 sec)
(2) 賦予 zj4@localhost 所有數(shù)據(jù)庫(kù)上的所有表的 select 權(quán)限
MySQL [(none)]> grant select on *.* to 'zj4'@'localhost'; Query OK, 0 rows affected, 1 warning (0.00 sec)  MySQL [(none)]> show grants for zj4@localhost; +------------------------------------------+ | Grants for zj4@localhost                 | +------------------------------------------+ | GRANT SELECT ON *.* TO 'zj4'@'localhost' | +------------------------------------------+ 1 row in set (0.00 sec)
(3) 繼續(xù)給 zj4@localhost 賦予 select 和 insert 權(quán)限,和已有的 select 權(quán)限進(jìn)行合并
MySQL [(none)]> show grants for 'zj4'@'localhost'; +--------------------------------------------------+ | Grants for zj4@localhost                         | +--------------------------------------------------+ | GRANT SELECT, INSERT ON *.* TO 'zj4'@'localhost' | +--------------------------------------------------+ 1 row in set (0.00 sec)

revoke 語(yǔ)句可以回收已經(jīng)賦予的權(quán)限,對(duì)于上面的例子,這里決定要收回 zj4@localhost 上的 insert 和 select 權(quán)限:

MySQL [(none)]> revoke select,insert on *.* from zj4@localhost; Query OK, 0 rows affected, 1 warning (0.00 sec)  MySQL [(none)]> show grants for zj4@localhost; +-----------------------------------------+ | Grants for zj4@localhost                | +-----------------------------------------+ | GRANT USAGE ON *.* TO 'zj4'@'localhost' | +-----------------------------------------+ 1 row in set (0.00 sec)

usage 權(quán)限不能被回收,也就是說(shuō),revoke 用戶并不能刪除用戶。

4. 修改賬號(hào)密碼

(1) 可以用 mysqladmin 命令在命令行指定密碼。
shell> mysqladmin -u user_name -h host_name password "123456"
(2) 執(zhí)行 set password 語(yǔ)句。
mysql> set password for 'username'@'%' = password('pwd');

如果是更改自己的密碼,可以省略 for 語(yǔ)句

mysql> set password=password('pwd');
(3) 可以在全局級(jí)別使用 grant usage 語(yǔ)句(在“.”)來(lái)指定某個(gè)賬戶的密碼而不影響賬戶當(dāng)前的權(quán)限。
mysql> grant usage on *.* to 'username'@'%' identified by 'pwd';

5. 刪除賬號(hào)

要徹底的刪除賬號(hào),可以使用 drop user :

drop user zj@localhost;

6. 賬號(hào)資源限制

創(chuàng)建 MySQL 賬號(hào)時(shí),還有一類選項(xiàng)稱為賬號(hào)資源限制,這類選項(xiàng)的作用是限制每個(gè)賬號(hào)實(shí)際具有的資源限制,這里的“資源”主要包括:

  • max_queries_per_hour count : 單個(gè)賬號(hào)每小時(shí)執(zhí)行的查詢次數(shù)

  • max_upodates_per_hour count : 單個(gè)賬號(hào)每小時(shí)執(zhí)行的更新次數(shù)

  • max_connections_per_hour count : 單個(gè)賬號(hào)每小時(shí)連接服務(wù)器的次數(shù)

  • max_user_connections count : 單個(gè)賬號(hào)并發(fā)連接服務(wù)器的次數(shù)

  • MySQL如何進(jìn)行權(quán)限管理?

    • 舉報(bào)

你可能感興趣的

評(píng)論 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

默認(rèn)排序 ? ? ? ? ? ? ? ? ? ? ? ?時(shí)間排序

載入中…

顯示更多評(píng)論

MySQL如何進(jìn)行權(quán)限管理?

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊14 分享