角色一直存在各個(gè)數(shù)據(jù)庫中,比如 SQL Server、Oracle 等,MySQL 自從版本 8.0 release,引入了角色這個(gè)概念。
班瑪ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
角色的概念
角色就是一組針對各種數(shù)據(jù)庫權(quán)限的集合。比如,把一個(gè)角色分配給一個(gè)用戶,那這個(gè)用戶就擁有了這個(gè)角色包含的所有權(quán)限。一個(gè)角色可以分配給多個(gè)用戶,另外一個(gè)用戶也可以擁有多個(gè)角色,兩者是多對多的關(guān)系。不過 MySQL 角色目前還沒有提供類似于其他數(shù)據(jù)庫的系統(tǒng)預(yù)分配的角色。比如某些數(shù)據(jù)庫的 db_owner、 db_datareader 、 db_datawriter 等等。那接下來我分幾個(gè)方面,來示例說明角色的使用以及相關(guān)注意事項(xiàng)。
示例 1:一個(gè)完整角色的授予步驟
用管理員創(chuàng)建三個(gè)角色:db_owner, db_datareader, db_datawriter
mysql create role db_owner,db_datareader,db_datawriter;
Query OK, 0 rows affected (0.02 sec)
mysql grant all on ytt_new.* to db_owner;
Query OK, 0 rows affected (0.01 sec)
mysql grant select on ytt_new.* to db_datareader;
Query OK, 0 rows affected (0.01 sec)
mysql grant insert,delete,update on ytt_new.* to db_datawriter;
Query OK, 0 rows affected (0.01 sec)
創(chuàng)建三個(gè)普通用戶,分別為 ytt1、ytt2、ytt3。mysql create user ytt1 identified by 'ytt',ytt2 identified by 'ytt',ytt3 identified by 'ytt';Query OK, 0 rows affected (0.01 sec)
分別授予這三個(gè)用戶對應(yīng)的角色。
-- 授權(quán)角色
mysql grant db_owner to ytt1;
Query OK, 0 rows affected (0.02 sec)
-- 激活角色
mysql set default role db_owner to ytt1;
Query OK, 0 rows affected (0.00 sec)
mysql grant db_datareader to ytt2;
Query OK, 0 rows affected (0.01 sec)
mysql set default role db_datareader to ytt2;
Query OK, 0 rows affected (0.01 sec)
mysql grant db_datawriter to ytt3;
Query OK, 0 rows affected (0.01 sec)
mysql set default role db_datawriter to ytt3;
Query OK, 0 rows affected (0.01 sec)
以上是角色授予的一套完整步驟。那上面有點(diǎn)非常規(guī)的地方是激活角色這個(gè)步驟。MySQL 角色在創(chuàng)建之初默認(rèn)是沒有激活的,也就是說創(chuàng)建角色,并且給一個(gè)用戶特定的角色,這個(gè)用戶其實(shí)并不能直接使用這個(gè)角色,除非激活了才可以。
示例 2:一個(gè)用戶可以擁有多個(gè)角色
-- 用管理員登錄并且創(chuàng)建用戶
mysql create user ytt4 identified by 'ytt';
Query OK, 0 rows affected (0.00 sec)
-- 把之前的三個(gè)角色都分配給用戶ytt4.
mysql grant db_owner,db_datareader,db_datawriter to ytt4;
Query OK, 0 rows affected (0.01 sec)
-- 激活用戶ytt4的所有角色.
mysql set default role all to ytt4;
Query OK, 0 rows affected (0.02 sec)
-- ytt4 用戶登錄
root@ytt-pc:/var/lib/mysql# mysql -uytt4 -pytt -P3304 -hytt-pc
...
-- 查看當(dāng)前角色列表
mysql select current_role();
+--------------------------------------------------------+
| current_role() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
+--------------------------------------------------------+
| `db_datareader`@`%`,`db_datawriter`@`%`,`db_owner`@`%` |
+--------------------------------------------------------+
1 row in set (0.00 sec)
-- 簡單創(chuàng)建一張表并且插入記錄, 檢索記錄,完了刪掉這張表
mysql use ytt_new
Database changed
mysql create table t11(id int);
Query OK, 0 rows affected (0.05 sec)
mysql insert into t11 values (1);
Query OK, 1 row affected (0.02 sec)
mysql select * from t11;
+------+
| id ? |
+------+
| ? ?1 |
+------+
1 row in set (0.00 sec)
mysql drop table t11;
Query OK, 0 rows affected (0.04 sec)
示例 3:用戶在當(dāng)前 session 里角色互換
其實(shí)意思是說,用戶連接到 MySQL 服務(wù)器后,可以切換當(dāng)前的角色列表,比如由 db_owner 切換到 db_datareader。
-- 還是之前的用戶ytt4, 切換到db_datareader
mysql set role db_datareader;
Query OK, 0 rows affected (0.00 sec)
mysql select current_role();
+---------------------+
| current_role() ? ? ?|
+---------------------+
| `db_datareader`@`%` |
+---------------------+
1 row in set (0.00 sec)
-- 切換后,沒有權(quán)限創(chuàng)建表
mysql create table t11(id int);
ERROR 1142 (42000): CREATE command denied to user 'ytt4'@'ytt-pc' for table 't11'
-- 切換到 db_owner,恢復(fù)所有權(quán)限。
mysql set role db_owner;
Query OK, 0 rows affected (0.00 sec)
mysql create table t11(id int);
Query OK, 0 rows affected (0.04 sec)
示例 4:關(guān)于角色的兩個(gè)參數(shù)
activate_all_roles_on_login:是否在連接 MySQL 服務(wù)時(shí)自動(dòng)激活角色mandatory_roles:強(qiáng)制所有用戶默認(rèn)角色
-- 用管理員連接MySQL,
-- 設(shè)置默認(rèn)激活角色
mysql set global activate_all_roles_on_login=on;
Query OK, 0 rows affected (0.00 sec)
-- 設(shè)置強(qiáng)制給所有用戶賦予角色db_datareader
mysql set global mandatory_roles='db_datareader';
Query OK, 0 rows affected (0.00 sec)
-- 創(chuàng)建用戶ytt7.
mysql create user ytt7;
Query OK, 0 rows affected (0.01 sec)
-- 用 ytt7登錄數(shù)據(jù)庫
root@ytt-pc:/var/lib/mysql# mysql -uytt7 -P3304 -hytt-pc
...
mysql show grants;
+-------------------------------------------+
| Grants for ytt7@% ? ? ? ? ? ? ? ? ? ? ? ? |
+-------------------------------------------+
| GRANT USAGE ON *.* TO `ytt7`@`%` ? ? ? ? ?|
| GRANT SELECT ON `ytt_new`.* TO `ytt7`@`%` |
| GRANT `db_datareader`@`%` TO `ytt7`@`%` ? |
+-------------------------------------------+
3 rows in set (0.00 sec)
示例 5 :create role 和 create user 都有創(chuàng)建角色權(quán)限,兩者有啥區(qū)別?
以下分別創(chuàng)建兩個(gè)用戶 ytt8、ytt9,一個(gè)給 create role,一個(gè)給 create user 權(quán)限。
-- 管理員登錄,創(chuàng)建用戶ytt8,ytt9.
mysql create user ytt8,ytt9;
Query OK, 0 rows affected (0.01 sec)
mysql grant create role on *.* to ytt8;
Query OK, 0 rows affected (0.02 sec)
mysql grant create user on *.* to ytt9;
Query OK, 0 rows affected (0.01 sec)
-- 用ytt8 登錄,
root@ytt-pc:/var/lib/mysql# mysql -uytt8 -P3304 -hytt-pc
...
mysql create role db_test;
Query OK, 0 rows affected (0.02 sec)
-- 可以創(chuàng)建角色,但是不能創(chuàng)建用戶
mysql create user ytt10;
ERROR 1227 (42000): Access denied; you need (at least one of) the CREATE USER privilege(s) for this operation
mysql \q
Bye
-- 用ytt9 登錄
root@ytt-pc:/var/lib/mysql# mysql -uytt9 -P3304 -hytt-pc
...
-- 角色和用戶都能創(chuàng)建
mysql create role db_test2;
Query OK, 0 rows affected (0.02 sec)
mysql create user ytt10;
Query OK, 0 rows affected (0.01 sec)
mysql \q
Bye
那這里其實(shí)看到 create user 包含了 create role,create user 即可以創(chuàng)建用戶,也可以創(chuàng)建角色。
示例 6:MySQL 用戶也可以當(dāng)角色來用
-- 用管理員登錄,創(chuàng)建用戶ytt11,ytt12.
mysql create user ytt11,ytt12;
Query OK, 0 rows affected (0.01 sec)
mysql grant select on ytt_new.* to ytt11;
Query OK, 0 rows affected (0.01 sec)
-- 把ytt11普通用戶的權(quán)限授予給ytt12
mysql grant ytt11 to ytt12;
Query OK, 0 rows affected (0.01 sec)
-- 來查看 ytt12的權(quán)限,可以看到擁有了ytt11的權(quán)限
mysql show grants for ytt12;
+-----------------------------------+
| Grants for ytt12@% ? ? ? ? ? ? ? ?|
+-----------------------------------+
| GRANT USAGE ON *.* TO `ytt12`@`%` |
| GRANT `ytt11`@`%` TO `ytt12`@`%` ?|
+-----------------------------------+
2 rows in set (0.00 sec)
-- 在細(xì)化點(diǎn),看看ytt12擁有哪些具體的權(quán)限
mysql show grants for ytt12 using ytt11;
+--------------------------------------------+
| Grants for ytt12@% ? ? ? ? ? ? ? ? ? ? ? ? |
+--------------------------------------------+
| GRANT USAGE ON *.* TO `ytt12`@`%` ? ? ? ? ?|
| GRANT SELECT ON `ytt_new`.* TO `ytt12`@`%` |
| GRANT `ytt11`@`%` TO `ytt12`@`%` ? ? ? ? ? |
+--------------------------------------------+
3 rows in set (0.00 sec)
示例 7:角色的撤銷
角色撤銷和之前權(quán)限撤銷類似。要么 revoke,要么刪除角色,那這個(gè)角色會(huì)從所有擁有它的用戶上移除。
-- 用管理員登錄,移除ytt2的角色
mysql revoke db_datareader from ytt2;
Query OK, 0 rows affected (0.01 sec)
-- 刪除所有角色
mysql drop role db_owner,db_datareader,db_datawriter;
Query OK, 0 rows affected (0.01 sec)
-- 對應(yīng)的角色也從ytt1上移除掉了
mysql show grants for ytt1;
+----------------------------------+
| Grants for ytt1@% ? ? ? ? ? ? ? ?|
+----------------------------------+
| GRANT USAGE ON *.* TO `ytt1`@`%` |
+----------------------------------+
1 row in set (0.00 sec)
至此,我分了 7 個(gè)目錄說明了角色在各個(gè)方面的使用以及注意事項(xiàng),希望對大家有幫助。
MySQL的權(quán)限有哪些?
一.權(quán)限表
mysql數(shù)據(jù)庫中的3個(gè)權(quán)限表:user
、db、
host
權(quán)限表的存取過程是:
1)先從user表中的host、
user、
password這3個(gè)字段中判斷連接的IP、用戶名、密碼是否存在表中,存在則通過身份驗(yàn)證;
2)通過權(quán)限驗(yàn)證,進(jìn)行權(quán)限分配時(shí),按照useràdbàtables_privàcolumns_priv的順序進(jìn)行分配。即先檢查全局權(quán)限表user,如果user中對應(yīng)的權(quán)限為Y,則此用戶對所有數(shù)據(jù)庫的權(quán)限都為Y,將不再檢查db,
tables_priv,columns_priv;如果為N,則到db表中檢查此用戶對應(yīng)的具體數(shù)據(jù)庫,并得到db中為Y的權(quán)限;如果db中為N,則檢查tables_priv中此數(shù)據(jù)庫對應(yīng)的具體表,取得表中的權(quán)限Y,以此類推。
二.MySQL各種權(quán)限(共27個(gè))
(以下操作都是以root身份登陸進(jìn)行g(shù)rant授權(quán),以p1@localhost身份登陸執(zhí)行各種命令。)
1.
usage
連接(登陸)權(quán)限,建立一個(gè)用戶,就會(huì)自動(dòng)授予其usage權(quán)限(默認(rèn)授予)。
mysql
grant
usage
on
*.*
to
‘p1′@’localhost’
identified
by
‘123′;
該權(quán)限只能用于數(shù)據(jù)庫登陸,不能執(zhí)行任何操作;且usage權(quán)限不能被回收,也即REVOKE用戶并不能刪除用戶。
2.
select
必須有select的權(quán)限,才可以使用select
table
mysql
grant
select
on
pyt.*
to
‘p1′@’localhost’;
mysql
select
*
from
shop;
3.
create
必須有create的權(quán)限,才可以使用create
table
mysql
grant
create
on
pyt.*
to
‘p1′@’localhost’;
4.
create
routine
必須具有create
routine的權(quán)限,才可以使用{create
|alter|drop}
{procedure|function}
mysql
grant
create
routine
on
pyt.*
to
‘p1′@’localhost’;
當(dāng)授予create
routine時(shí),自動(dòng)授予EXECUTE,
ALTER
ROUTINE權(quán)限給它的創(chuàng)建者:
mysql
show
grants
for
‘p1′@’localhost’;
+—————————————————————————+
Grants
for
p1@localhost
+————————————————————————–+
|
GRANT
USAGE
ON
*.*
TO
‘p1′@’localhost’
IDENTIFIED
BY
PASSWORD
‘*23AE809DDACAF96AF0FD78ED04B6A265E05AA257′
|
|
GRANT
SELECT,
CREATE,
CREATE
ROUTINE
ON
`pyt`.*
TO
‘p1′@’localhost’|
|
GRANT
EXECUTE,
ALTER
ROUTINE
ON
PROCEDURE
`pyt`.`pro_shop1`
TO
‘p1′@’localhost’
|
+————————————————————————————-+
5.
create
temporary
tables(注意這里是tabl
背景
在了解動(dòng)態(tài)權(quán)限之前,我們先回顧下 MySQL 的權(quán)限列表。
權(quán)限列表大體分為服務(wù)級別和表級別,列級別以及大而廣的角色(也是MySQL 8.0 新增)存儲程序等權(quán)限。我們看到有一個(gè)特殊的 SUPER 權(quán)限,可以做好多個(gè)操作。比如 SET 變量,在從機(jī)重新指定相關(guān)主機(jī)信息以及清理二進(jìn)制日志等。那這里可以看到,SUPER 有點(diǎn)太過強(qiáng)大,導(dǎo)致了僅僅想實(shí)現(xiàn)子權(quán)限變得十分困難,比如用戶只能 SET 變量,其他的都不想要。那么 MySQL 8.0 之前沒法實(shí)現(xiàn),權(quán)限的細(xì)分不夠明確,容易讓非法用戶鉆空子。
那么 MySQL 8.0 把權(quán)限細(xì)分為靜態(tài)權(quán)限和動(dòng)態(tài)權(quán)限,下面我畫了兩張?jiān)敿?xì)的區(qū)分圖,圖 1 為靜態(tài)權(quán)限,圖 2 為動(dòng)態(tài)權(quán)限。
圖 1- MySQL 靜態(tài)權(quán)限的權(quán)限管理圖
圖 2-動(dòng)態(tài)權(quán)限圖
那我們看到其實(shí)動(dòng)態(tài)權(quán)限就是對 SUPER 權(quán)限的細(xì)分。 SUPER 權(quán)限在未來將會(huì)被廢棄掉。
我們來看個(gè)簡單的例子,
比如, 用戶 'ytt2@localhost', 有 SUPER 權(quán)限。
mysql show grants for ytt2@'localhost';+---------------------------------------------------------------------------------+| Grants for ytt2@localhost ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |+---------------------------------------------------------------------------------+| GRANT INSERT, UPDATE, DELETE, CREATE, ALTER, SUPER ON *.* TO ytt2@localhost |+---------------------------------------------------------------------------------+1 row in set (0.00 sec)
但是現(xiàn)在我只想這個(gè)用戶有 SUPER 的子集,設(shè)置變量的權(quán)限。那么單獨(dú)給這個(gè)用戶賦予兩個(gè)能設(shè)置系統(tǒng)變量的動(dòng)態(tài)權(quán)限,完了把 SUPER 給拿掉。
mysql grant session_variables_admin,system_variables_admin on *.* to ytt2@'localhost';Query OK, 0 rows affected (0.03 sec)mysql revoke super on *.* from ytt2@'localhost';Query OK, 0 rows affected, 1 warning (0.02 sec)
我們看到這個(gè) WARNINGS 提示 SUPER 已經(jīng)廢棄了。
mysql show warnings;
+---------+------+----------------------------------------------+
| Level ? | Code | Message ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|
+---------+------+----------------------------------------------+
| Warning | 1287 | The SUPER privilege identifier is deprecated |
+---------+------+----------------------------------------------+
1 row in set (0.00 sec)`
mysql show grants for ytt2@'localhost';
+-----------------------------------------------------------------------------------+
| Grants for ytt2@localhost ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
+-----------------------------------------------------------------------------------+
| GRANT INSERT, UPDATE, DELETE, CREATE, ALTER ON *.* TO ytt2@localhost ? ? ? ? ?|
| GRANT SESSION_VARIABLES_ADMIN,SYSTEM_VARIABLES_ADMIN ON *.* TO ytt2@localhost |
+-----------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
當(dāng)然圖 2 上還有其它的動(dòng)態(tài)權(quán)限,這里就不做特別說明了。
查看用戶權(quán)限
mysql show grants for zx_root;
賦予權(quán)限
mysql grant select on dmc_db.* to zx_root;
回收權(quán)限
mysql revoke select on dmc_db.* from zx_root; //如果權(quán)限不存在會(huì)報(bào)錯(cuò)
設(shè)置權(quán)限時(shí)必須給出一下信息
1,要授予的權(quán)限
2,被授予訪問權(quán)限的數(shù)據(jù)庫或表
3,用戶名
grant和revoke可以在幾個(gè)層次上控制訪問權(quán)限
1,整個(gè)服務(wù)器,使用 grant ALL 和revoke ALL
2,整個(gè)數(shù)據(jù)庫,使用on database.*
3,特點(diǎn)表,使用on database.table
4,特定的列
5,特定的存儲過程