通過視圖管控?cái)?shù)據(jù)權(quán)限
本文介紹如何通過視圖實(shí)現(xiàn)給不同的賬號(hào)授予查詢同一表中不同數(shù)據(jù)的權(quán)限,來提供數(shù)據(jù)的安全性。
場景需求
已創(chuàng)建了一張包含不同省份客戶的表customer
,建表語句如下:
CREATE TABLE `customer` (
`id` BIGINT AUTO_INCREMENT,
`province_id` BIGINT NOT NULL,
`user_info` VARCHAR,
PRIMARY KEY (`id`)
) DISTRIBUTED BY HASH(`id`);
往表customer
中插入測試數(shù)據(jù),語句如下:
INSERT INTO customer(province_id,user_info) VALUES (1,'Tom'),(1,'Jerry'),(2,'Jerry'),(3,'Mark');
通過SELECT語句可查詢到表中當(dāng)前數(shù)據(jù)如下:
+---------------------+-------------+-----------+
| id | province_id | user_info |
+---------------------+-------------+-----------+
| 1369417242420617216 | 1 | Tom |
| 1369417242424811520 | 1 | Jerry |
| 1369417242424811522 | 3 | Mark |
| 1369417242424811521 | 2 | Jerry |
+---------------------+-------------+-----------+
要求user1
僅能查看省份1(即province_id=1
)的數(shù)據(jù),而user2
僅能查看省份2(即province_id=2
)的數(shù)據(jù)。
實(shí)現(xiàn)方式
您可以通過如下操作步驟實(shí)現(xiàn)上述場景需求:
為省份1和省份2分別創(chuàng)建一個(gè)視圖
v1
和v2
,語句如下:查詢省份1數(shù)據(jù)的視圖創(chuàng)建語句。
CREATE SQL SECURITY DEFINER VIEW v1 AS SELECT * FROM customer WHERE province_id=1;
查詢省份2數(shù)據(jù)的視圖創(chuàng)建語句。
CREATE SQL SECURITY DEFINER VIEW v2 AS SELECT * FROM customer WHERE province_id=2;
說明創(chuàng)建視圖語句中各參數(shù)的詳細(xì)介紹,請(qǐng)參見CREATE VIEW。
視圖創(chuàng)建成功后,通過GRANT語句將對(duì)應(yīng)的數(shù)據(jù)查詢權(quán)限授予給目標(biāo)用戶,語句如下:
說明創(chuàng)建賬號(hào)的方法,請(qǐng)參見CREATE USER。
授予
user1
通過v1
視圖查詢省份1數(shù)據(jù)的權(quán)限:GRANT SELECT ON v1 TO user1;
授予
user2
通過v2
視圖查詢省份2數(shù)據(jù)的權(quán)限:GRANT SELECT ON v2 TO user2;
查詢結(jié)果驗(yàn)證
使用
user1
賬號(hào)連接AnalyticDB for MySQL集群的adb_demo
數(shù)據(jù)庫后,user1
僅能查詢到視圖v1
數(shù)據(jù),查詢語句如下:SELECT * FROM v1;
查詢結(jié)果如下:
+---------------------+-------------+-----------+ | ID | PROVINCE_ID | USER_INFO | +---------------------+-------------+-----------+ | 1369417242420617216 | 1 | Tom | | 1369417242424811520 | 1 | Jerry | +---------------------+-------------+-----------+
若
user1
想要查詢視圖v2
中的數(shù)據(jù),則會(huì)出現(xiàn)如下錯(cuò)誤:ERROR 1815 (HY000): [9001, 2021083114191719216818804803453965343] : Access Denied
使用
user2
賬號(hào)連接AnalyticDB for MySQL集群的adb_demo
數(shù)據(jù)庫后,user2
僅能查詢到視圖v2
數(shù)據(jù),查詢語句如下:SELECT * FROM v2;
查詢結(jié)果如下:
+---------------------+-------------+-----------+ | ID | PROVINCE_ID | USER_INFO | +---------------------+-------------+-----------+ | 1369417242424811521 | 2 | Jerry | +---------------------+-------------+-----------+
若
user2
想要查詢視圖v1
中的數(shù)據(jù),也會(huì)出現(xiàn)如下錯(cuò)誤:ERROR 1815 (HY000): [9001, 2021083114191719216818804803453965343] : Access Denied