您好,登錄后才能下訂單哦!
role角色功能對于Oracle數據庫來說不算是什么特殊, 然而對于mysql來說 MySQL8.0新增了role角色功能意義還是令人新奇不少,同時也是很多使用MySQL服務的用戶一直所期盼的
MySQL8.0中新增的role功能,DBA可以創建角色,對其賦予權限,并且將他們授權用戶,使用角色可以大量減輕DBA的工作,可以輕松管理每個團隊、用戶的各種復雜的權限。
下面詳細介紹一下MySQL中如何使用角色:
創建角色使用 “CREATE ROLE”語句,假設我們為應用程序創建只讀角色、讀寫角色和開發人員角色。
root@localhost:mysql.sock 20:37: [(none)]>create role 'db_read', 'db_rw', 'db_dev';
Query OK, 0 rows affected (0.08 sec)
角色的名稱與MySQL的賬戶名稱非常相似,由用戶名+主機名稱構成,如果省略主機名稱則默認為'%'。
root@localhost:mysql.sock 20:39: [(none)]>drop role db_dev;
Query OK, 0 rows affected (0.08 sec)
角色創建以后,需要對其賦予相應的權限。使用下列語句分別對角色賦予全部權限、只讀權限和讀寫權限:
全部權限:
root@localhost:mysql.sock 20:43: [(none)]>create role 'db_dev';
Query OK, 0 rows affected (0.03 sec)
root@localhost:mysql.sock 20:44: [(none)]>grant all on app_db.* to 'db_dev';
Query OK, 0 rows affected (0.04 sec)
只讀權限:
root@localhost:mysql.sock 20:44: [(none)]>grant select on app_db.* to 'db_read';
Query OK, 0 rows affected (0.08 sec)
讀寫權限:
root@localhost:mysql.sock 20:46: [(none)]>grant select,insert,update,delete on app_db.* to 'db_rw';
Query OK, 0 rows affected (0.07 sec)
例如:
創建用戶:
root@localhost:mysql.sock 20:50: [(none)]>create user 'db_dev_user'@'localhost' identified by 'passjw01';
Query OK, 0 rows affected (0.09 sec)
root@localhost:mysql.sock 20:52: [(none)]>create user 'db_read_user'@'localhost' identified by 'passjw02';
Query OK, 0 rows affected (0.08 sec)
root@localhost:mysql.sock 20:52: [(none)]>create user 'db_rw_user'@'localhost' identified by 'passjw03';
Query OK, 0 rows affected (0.05 sec)
授予角色權限:
root@localhost:mysql.sock 20:53: [(none)]>grant 'db_dev' to 'db_dev_user'@'localhost';
Query OK, 0 rows affected (0.07 sec)
root@localhost:mysql.sock 20:54: [(none)]>grant 'db_read' to 'db_read_user'@'localhost';
Query OK, 0 rows affected (0.02 sec)
root@localhost:mysql.sock 20:54: [(none)]>grant 'db_rw' to 'db_rw_user'@'localhost';
Query OK, 0 rows affected (0.07 sec)
root@localhost:mysql.sock 20:54: [(none)]>revoke 'db_dev' from 'db_dev_user'@'localhost';
Query OK, 0 rows affected (0.03 sec)
root@localhost:mysql.sock 20:55: [(none)]>revoke all on app_db.* from db_dev;
Query OK, 0 rows affected (0.10 sec)
root@localhost:mysql.sock 20:57: [(none)]>
當角色授予用戶后,我們可以查看用戶擁有的權限,執行:
root@localhost:mysql.sock 20:59: [(none)]>show grants for 'db_rw_user'@'localhost';
+------------------------------------------------+
| Grants for db_rw_user@localhost |
+------------------------------------------------+
| GRANT USAGE ON *.* TO `db_rw_user`@`localhost` |
| GRANT `db_rw`@`%` TO `db_rw_user`@`localhost` |
+------------------------------------------------+
2 rows in set (0.00 sec)
是否注意到,執行show grants語句只是看到了用戶被賦予了角色,該角色具有哪些權限該如何查看呢?執行下面的語句可以確認相關內容:
root@localhost:mysql.sock 21:01: [(none)]>show grants for 'db_rw_user'@'localhost' using 'db_rw';
+--------------------------------------------------------------------------------+
| Grants for db_rw_user@localhost |
+--------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `db_rw_user`@`localhost` |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `app_db`.* TO `db_rw_user`@`localhost` |
| GRANT `db_rw`@`%` TO `db_rw_user`@`localhost` |
+--------------------------------------------------------------------------------+
3 rows in set (0.00 sec)
MySQL可以通過mandatory_roles 變量來配置強制性角色。使用強制性角色,服務器會為全部的賬戶默認賦予該角色,
而不需要顯示執行賦予角色。可以使用my.cnf文件或者使用SET PERSIST進行配置,例如:
[mysqld]
mandatory_roles='role1,role2@localhost'
SET PERSIST mandatory_roles = 'role1,role2@localhost;
需要注意的是,配置在mandatory_roles中的角色不能撤銷其權限,也不能刪除。
賦予用戶帳戶的角色在帳戶會話中可以處于活動狀態,也可以處于非活動狀態。如果賦予的角色在會話中處于活動狀態,
則具有相應的權限,反之則沒有。要確定當前會話中哪些角色處于活動狀態,使用CURRENT_ROLE()函數。
root@localhost:mysql.sock 21:01: [(none)]>select CURRENT_ROLE();
+----------------+
| CURRENT_ROLE() |
+----------------+
| NONE |
+----------------+
1 row in set (0.00 sec)
默認情況下,向帳戶賦予角色或在mandatory_roles系統變量值中為其命名后,該角色在帳戶會話中不會變為活動狀態。
要指定每次用戶連接到服務器,進行身份驗證時激活角色,請使用 SET DEFAULT ROLE:
root@localhost:mysql.sock 21:04: [(none)]>set default role all to 'db_dev_user'@'localhost', 'db_rw_user'@'localhost', 'db_read_user'@'localhost';
Query OK, 0 rows affected (0.06 sec)
之后,用app_dev_user登陸服務器,查看當前角色權限:
[root@localhost ~]# mysql -udb_rw_user -p'passjw03'
db_rw_user@localhost:mysql.sock 21:11: [(none)]>show databases;
+--------------------+
| Database |
+--------------------+
| app_db |
| information_schema |
+--------------------+
db_rw_user@localhost:mysql.sock 21:11: [(none)]>select CURRENT_ROLE();
+----------------+
| CURRENT_ROLE() |
+----------------+
| `db_rw`@`%` |
+----------------+
1 row in set (0.00 sec)
查看當前登錄用戶:
db_rw_user@localhost:mysql.sock 10:39: [(none)]>select current_user();
+----------------------+
| current_user() |
+----------------------+
| db_rw_user@localhost |
+----------------------+
1 row in set (0.00 sec)
db_rw_user@localhost:mysql.sock 10:39: [(none)]>select current_user;
+----------------------+
| current_user |
+----------------------+
| db_rw_user@localhost |
+----------------------+
1 row in set (0.00 sec)
要在用戶連接到服務器時,使所有顯式賦予的角色和強制角色自動激活,請啟用activate_all_roles_on_login 系統變量。默認情況下,禁用自動角色激活。
關于MySQL中使用角色就介紹到這里,更為詳盡的內容請訪問官網手冊
https://dev.mysql.com/doc/refman/8.0/en/roles.html
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。