MySQL8 基于角色的權(quán)限管理

MySQL8新增了角色(role)的概念,使賬號權(quán)限的管理施籍,更加靈活方便居扒。所謂角色,就是一些權(quán)限的集合丑慎。然后再把該集合授權(quán)給某個(gè)賬戶(往往是某一批賬戶喜喂,因?yàn)橘~號會(huì)綁定IP,不同的IP竿裂,雖然賬號名相同被視為不同賬號)玉吁,這樣當(dāng)我們需要對這些賬號減少或增加權(quán)限時(shí),只需要修改權(quán)限集合(role)即可腻异,不用單個(gè)賬號多次修改进副。這確實(shí)使DBA的運(yùn)維輕松了不少。

下面我們看下role是如何使用的悔常。

創(chuàng)建角色

比如開發(fā)環(huán)境賬戶需要某庫的所有權(quán)限影斑,生產(chǎn)環(huán)境賬號往往需要增刪改查這些權(quán)限,我們可以單獨(dú)為這些權(quán)限建一個(gè)role.如果有讀寫分離机打,還可以建兩個(gè)讀和寫的role矫户。


create role 'app_dev','app_read','app_write';

mysql8[(none)]>show grants for 'app_dev';

+-------------------------------------+

| Grants for app_dev@%                |

+-------------------------------------+

| GRANT USAGE ON *.* TO `app_dev`@`%` |

+-------------------------------------+

創(chuàng)建角色時(shí)同樣可以綁定Host(默認(rèn)%), 即角色名分為name + host兩部分,這和賬號沒有什么區(qū)別姐帚。

同樣創(chuàng)建的角色也和賬號一樣保存在mysql.user表中吏垮。通過查詢此表可以看到角色的信息:


mysql8[(none)]>select * from mysql.user;

+-----------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+----------------------+-----------------------+------------------------------------------------------------------------+------------------+-----------------------+-------------------+----------------+------------------+----------------+------------------------+---------------------+

| Host      | User            | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Reload_priv | Shutdown_priv | Process_priv | File_priv | Grant_priv | References_priv | Index_priv | Alter_priv | Show_db_priv | Super_priv | Create_tmp_table_priv | Lock_tables_priv | Execute_priv | Repl_slave_priv | Repl_client_priv | Create_view_priv | Show_view_priv | Create_routine_priv | Alter_routine_priv | Create_user_priv | Event_priv | Trigger_priv | Create_tablespace_priv | ssl_type | ssl_cipher | x509_issuer | x509_subject | max_questions | max_updates | max_connections | max_user_connections | plugin                | authentication_string                                                  | password_expired | password_last_changed | password_lifetime | account_locked | Create_role_priv | Drop_role_priv | Password_reuse_history | Password_reuse_time |

+-----------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+----------------------+-----------------------+------------------------------------------------------------------------+------------------+-----------------------+-------------------+----------------+------------------+----------------+------------------------+---------------------+

| %        | app_dev          | N          | N          | N          | N          | N          | N        | N          | N            | N            | N        | N          | N              | N          | N          | N            | N          | N                    | N                | N            | N              | N                | N                | N              | N                  | N                  | N                | N          | N            | N                      |          |            |            |              |            0 |          0 |              0 |                    0 | caching_sha2_password |                                                                        | Y                | 2018-06-14 11:27:35  |              NULL | Y              | N                | N              |                  NULL |                NULL |

| %        | app_read        | N          | N          | N          | N          | N          | N        | N          | N            | N            | N        | N          | N              | N          | N          | N            | N          | N                    | N                | N            | N              | N                | N                | N              | N                  | N                  | N                | N          | N            | N                      |          |            |            |              |            0 |          0 |              0 |                    0 | caching_sha2_password |                                                                        | Y                | 2018-06-14 11:27:35  |              NULL | Y              | N                | N              |                  NULL |                NULL |

| %        | app_write        | N          | N          | N          | N          | N          | N        | N          | N            | N            | N        | N          | N              | N          | N          | N            | N          | N                    | N                | N            | N              | N                | N                | N              | N                  | N                  | N                | N          | N            | N                      |          |            |            |              |            0 |          0 |              0 |                    0 | caching_sha2_password |                                                                        | Y                | 2018-06-14 11:27:35  |              NULL | Y              | N                | N              |                  NULL |                NULL |

| %        | repl            | N          | N          | N          | N          | N          | N        | N          | N            | N            | N        | N          | N              | N          | N          | N            | N          | N                    | N                | N            | Y              | N                | N                | N              | N                  | N                  | N             

給角色授權(quán)

上面我們建了三個(gè)role,但這三個(gè)role都只有usage權(quán)限障涯,我們還需要對角色進(jìn)行授權(quán)罐旗。授權(quán)方式與給賬號授權(quán)是完全一樣的膳汪。


mysql8[(none)]>grant select , insert,update,delete on test.* to app_dev;

Query OK, 0 rows affected (0.02 sec)

mysql8[(none)]>grant select on test.* to app_read;

Query OK, 0 rows affected (0.10 sec)

mysql8[(none)]>show grants for app_read;

+--------------------------------------------+

| Grants for app_read@%                      |

+--------------------------------------------+

| GRANT USAGE ON *.* TO `app_read`@`%`      |

| GRANT SELECT ON `test`.* TO `app_read`@`%` |

+--------------------------------------------+

2 rows in set (0.00 sec)

mysql8[(none)]>show grants for app_dev;

+-------------------------------------------------------------------+

| Grants for app_dev@%                                              |

+-------------------------------------------------------------------+

| GRANT USAGE ON *.* TO `app_dev`@`%`                              |

| GRANT SELECT, INSERT, UPDATE, DELETE ON `test`.* TO `app_dev`@`%` |

+-------------------------------------------------------------------+

授權(quán)后我們看到各角色已經(jīng)具有了相應(yīng)的權(quán)限。

將角色授權(quán)于賬號

下面我們創(chuàng)建具體的賬號九秀,并將相應(yīng)的role授權(quán)給賬號遗嗽。


mysql8[(none)]>create user dev01 identified with mysql_native_password by 'dev01';

Query OK, 0 rows affected (0.04 sec)

mysql8[(none)]>grant app_dev to dev01;

Query OK, 0 rows affected (0.05 sec)

mysql8[(none)]>show grants for dev01;

+------------------------------------+

| Grants for dev01@%                |

+------------------------------------+

| GRANT USAGE ON *.* TO `dev01`@`%`  |

| GRANT `app_dev`@`%` TO `dev01`@`%` |

+------------------------------------+

我們創(chuàng)建了一個(gè)賬號dev01,并授權(quán)角色app_dev, 執(zhí)行show grants 查看權(quán)限時(shí),看到的是角色鼓蜒,并不是具體的權(quán)限痹换。如果要查看具體的權(quán)限則需要這樣執(zhí)行show grants.


mysql8[(none)]>show grants for dev01 using app_dev;

+-----------------------------------------------------------------+

| Grants for dev01@%                                              |

+-----------------------------------------------------------------+

| GRANT USAGE ON *.* TO `dev01`@`%`                              |

| GRANT SELECT, INSERT, UPDATE, DELETE ON `test`.* TO `dev01`@`%` |

| GRANT `app_dev`@`%` TO `dev01`@`%`                              |

+-----------------------------------------------------------------+

通過使用using app_dev,會(huì)將賬號和角色的權(quán)限一并顯示都弹。

我們給角色app_dev添加create權(quán)限


mysql8[(none)]>grant create on test.* to app_dev;

Query OK, 0 rows affected (0.10 sec)

mysql8[(none)]>show grants for dev01 using app_dev;

+-------------------------------------------------------------------------+

| Grants for dev01@%                                                      |

+-------------------------------------------------------------------------+

| GRANT USAGE ON *.* TO `dev01`@`%`                                      |

| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE ON `test`.* TO `dev01`@`%` |

| GRANT `app_dev`@`%` TO `dev01`@`%`                                      |

+-------------------------------------------------------------------------+

3 rows in set (0.00 sec)

可以看到給角色添加權(quán)限后娇豫,dev01賬號也具有了create權(quán)限。

激活角色

上面的一些列操作貌似完美畅厢,dev02賬號可以使用了冯痢,其實(shí)還不行!使用dev01賬號登陸:


mysql> show grants for dev01 using app_dev;

+-------------------------------------------------------------------------+

| Grants for dev01@%                                                      |

+-------------------------------------------------------------------------+

| GRANT USAGE ON *.* TO `dev01`@`%`                                      |

| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE ON `test`.* TO `dev01`@`%` |

| GRANT `app_dev`@`%` TO `dev01`@`%`                                      |

+-------------------------------------------------------------------------+

3 rows in set (0.00 sec)

mysql> show databases;

+--------------------+

| Database          |

+--------------------+

| information_schema |

+--------------------+

1 row in set (0.01 sec)

發(fā)現(xiàn)權(quán)限也有框杜,但并看不到test庫浦楣,什么也無法執(zhí)行。為什么呢咪辱?角色沒有被激活


mysql> select current_role()

    -> ;

+----------------+

| current_role() |

+----------------+

| NONE          |

+----------------+

1 row in set (0.00 sec)

執(zhí)行select current_role()發(fā)現(xiàn)是None. 所授權(quán)的角色并沒有被激活振劳,因此這個(gè)賬號 還是廢柴一個(gè)。

對賬號激活權(quán)限也很簡單


mysql8[(none)]>set default role all to dev01;

Query OK, 0 rows affected (0.06 sec)

這樣對dev01授予的所有角色都會(huì)被激活油狂。再使用dev01登陸就正常訪問了历恐。


mysql> show databases;

+--------------------+

| Database          |

+--------------------+

| information_schema |

| test              |

+--------------------+

2 rows in set (0.01 sec)

mysql> select current_role();

+----------------+

| current_role() |

+----------------+

| `app_dev`@`%`  |

+----------------+

1 row in set (0.00 sec)

可以看到當(dāng)前激活的角色為app_dev.

感覺流程太繁瑣了,都授權(quán)完了還要激活专筷,但MySQL8 提供已一個(gè)參數(shù)夹供,可以使角色在賬號登陸后自動(dòng)被激活。


mysql8[(none)]>show global variables like 'activate_all_roles_on_login';

+-----------------------------+-------+

| Variable_name              | Value |

+-----------------------------+-------+

| activate_all_roles_on_login | OFF  |

+-----------------------------+-------+

1 row in set (0.01 sec)

mysql8[(none)]>set global activate_all_roles_on_login=ON;

Query OK, 0 rows affected (0.00 sec)

把a(bǔ)ctivate_all_roles_on_login設(shè)置為ON就可以了仁堪。


mysql8[(none)]>create user query identified with mysql_native_password by 'query';

Query OK, 0 rows affected (0.04 sec)

mysql8[(none)]>grant app_read to query;

Query OK, 0 rows affected (0.06 sec)

mysql8[(none)]>show grants for query using app_read;

+-----------------------------------------+

| Grants for query@%                      |

+-----------------------------------------+

| GRANT USAGE ON *.* TO `query`@`%`      |

| GRANT SELECT ON `test`.* TO `query`@`%` |

| GRANT `app_read`@`%` TO `query`@`%`    |

+-----------------------------------------+

3 rows in set (0.00 sec)

mysql8[(none)]>exit

使用query賬號登陸


mysql> show databases;

+--------------------+

| Database          |

+--------------------+

| information_schema |

| test              |

+--------------------+

2 rows in set (0.00 sec)

mysql> select current_user();

+----------------+

| current_user() |

+----------------+

| query@%        |

+----------------+

1 row in set (0.00 sec)

mysql> select current_role();

+----------------+

| current_role() |

+----------------+

| `app_read`@`%` |

+----------------+

1 row in set (0.00 sec)

可以看到角色已被激活哮洽。

角色和賬號交互使用

角色和賬號沒有什么區(qū)別,可以把一個(gè)賬號當(dāng)做一個(gè)角色弦聂,將其授權(quán)給其它賬號鸟辅。詳見MySQL 官方文檔


CREATE USER 'u1';

CREATE ROLE 'r1';

GRANT SELECT ON db1.* TO 'u1';

GRANT SELECT ON db2.* TO 'r1';

CREATE USER 'u2';

CREATE ROLE 'r2';

GRANT 'u1', 'r1' TO 'u2';

GRANT 'u1', 'r1' TO 'r2';

這也太靈活了吧? 我驚掉了下巴莺葫!

閱讀更多

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末匪凉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子捺檬,更是在濱河造成了極大的恐慌再层,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異聂受,居然都是意外死亡蒿秦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門蛋济,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棍鳖,“玉大人,你說我怎么就攤上這事碗旅《纱Γ” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵祟辟,是天一觀的道長医瘫。 經(jīng)常有香客問我,道長旧困,這世上最難降的妖魔是什么醇份? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮叮喳,結(jié)果婚禮上被芳,老公的妹妹穿的比我還像新娘。我一直安慰自己馍悟,他們只是感情好畔濒,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锣咒,像睡著了一般侵状。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上毅整,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天趣兄,我揣著相機(jī)與錄音,去河邊找鬼悼嫉。 笑死艇潭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的戏蔑。 我是一名探鬼主播蹋凝,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼总棵!你這毒婦竟也來了鳍寂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤情龄,失蹤者是張志新(化名)和其女友劉穎迄汛,沒想到半個(gè)月后捍壤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鞍爱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年鹃觉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片硬霍。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡帜慢,死狀恐怖笼裳,靈堂內(nèi)的尸體忽然破棺而出唯卖,到底是詐尸還是另有隱情,我是刑警寧澤躬柬,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布拜轨,位于F島的核電站,受9級特大地震影響允青,放射性物質(zhì)發(fā)生泄漏橄碾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一颠锉、第九天 我趴在偏房一處隱蔽的房頂上張望法牲。 院中可真熱鬧,春花似錦琼掠、人聲如沸拒垃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悼瓮。三九已至,卻和暖如春艰猬,著一層夾襖步出監(jiān)牢的瞬間横堡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工冠桃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留命贴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓食听,卻偏偏與公主長得像胸蛛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子碳蛋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 幾乎任何一個(gè)后臺胚泌,都會(huì)涉及到權(quán)限管理,哪些人(用戶)有能夠登陸肃弟,能夠操作哪些東西(權(quán)限)玷室。 基于角色的訪問控制方法...
    烤魚吃辣椒閱讀 10,439評論 1 71
  • 有了QQ零蓉,將號碼發(fā)給同事、同學(xué)穷缤、朋友敌蜂。 于是,即使多年沒見面的人都會(huì)或發(fā)個(gè)短信津肛,或打個(gè)電話章喉,或留個(gè)言支持我這個(gè)新手...
    高小花0218閱讀 141評論 0 0
  • 哭的時(shí)候沒人哄 于是我們學(xué)會(huì)了堅(jiān)強(qiáng) 怕的時(shí)候沒人陪 于是我們學(xué)會(huì)了勇敢 煩的時(shí)候沒人傾訴 于是我們學(xué)會(huì)了承受 累的...
    Mr酵母君閱讀 134評論 0 2
  • “奧呦…玩的是王者農(nóng)藥呀…怎么樣,玩的咋樣身坐?”秸脱,中午飯局上一哥們跟另一個(gè)手里抱著手機(jī)玩游戲的哥們調(diào)侃著說道。當(dāng)下如...
    將軍_84fd閱讀 421評論 0 0
  • 我是一只小小鳥部蛇, 膽小而懦弱摊唇。 飛也飛不高, 卻擁有無盡的勇氣和力量涯鲁。 這個(gè)世間巷查, 嘈雜的聲音, 繚亂的節(jié)奏抹腿。 到...
    阿俊xi閱讀 180評論 0 0