
# DWS基于角色的访问控制(RBAC)
#### 什么是基于角色的用户管理？
- 基于角色的访问控制（Role-Based Access Control，简称RBAC）是通过为角色赋予权限，使用户成为适当的角色而获取相应角色的权限。
 
- 角色是一组权限的抽象。
- 使用RBAC可以极大简化对权限的管理。
#### 什么是RBAC模型？
为角色赋予适当的权限。
指定用户为相应的角色。
![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000001268868080.png "点击放大")
#### 场景介绍
假设有两个SCHEMA：s1，s2。
有两组用户：
- 一组用户包括u1，u2，可以在s1中查询所有表，在s2中更新所有表。
- 另一组用户包括u3，u4，可以在s2中查询所有表，在s1中更新所有表。
![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000001269187988.png "点击放大")
#### 授予权限操作步骤
1. 使用系统管理员dbadmin连接DWS数据库。
2. 复制以下语句在窗口1中执行，创建本用例的SCHEMA s1和s2，用户u1\~u4。 
   ![](https://support.huaweicloud.com/bestpractice-dws/public_sys-resources/note_3.0-zh-cn.png)
   示例中*{password}*请替换成实际密码。
   ```
   CREATE SCHEMA s1;
   CREATE SCHEMA s2;
   CREATE USER u1 PASSWORD '{password}';
   CREATE USER u2 PASSWORD '{password}';
   CREATE USER u3 PASSWORD '{password}';
   CREATE USER u4 PASSWORD '{password}';
   ```
   
   
3. 复制以下语句在窗口1中执行，创建对应的s1.t1，s2.t1表。 
   ```
   CREATE TABLE s1.t1 (c1 int, c2 int);
   CREATE TABLE s2.t1 (c1 int, c2 int);
   ```
   
   
4. 复制以下语句在窗口1中执行，为表插入数据。 
   ```
   INSERT INTO s1.t1 VALUES (1,2);
   INSERT INTO s2.t1 VALUES (1,2);
   ```
   
   
5. 复制以下语句在窗口1中执行，创建4个角色。分别对应s1的查询权限、s1的更新权限、s2的查询权限、s2的更新权限。 
   ```
   CREATE ROLE rs1_select PASSWORD disable;  --s1的查询权限
   CREATE ROLE rs1_update PASSWORD disable;  --s1的更新权限
   CREATE ROLE rs2_select PASSWORD disable;  --s2的查询权限
   CREATE ROLE rs2_update PASSWORD disable;  --s2的更新权限
   ```
   
   
6. 复制以下语句在窗口1中执行，将SCHEMA s1和s2的访问权限先授予这些角色。 
   ```
   GRANT USAGE ON SCHEMA s1, s2 TO rs1_select, rs1_update,rs2_select, rs2_update;
   ```
   
   
7. 复制以下语句在窗口1中执行，将具体的权限授予这些角色。 
   ```
   GRANT SELECT ON ALL TABLES IN SCHEMA s1 TO rs1_select; --将s1下的所有表的查询权限授予角色rs1_select
   GRANT SELECT,UPDATE ON ALL TABLES IN SCHEMA s1 TO rs1_update;  --将s1下的所有表的查询、更新权限授予角色rs1_update
   GRANT SELECT ON ALL TABLES IN SCHEMA s2 TO rs2_select;  --将s2下的所有表的查询权限授予角色rs2_select
   GRANT SELECT,UPDATE ON ALL TABLES IN SCHEMA s2 TO rs2_update;  --将s2下的所有表的查询、更新权限授予角色rs2_update
   ```
   
   
8. 复制以下语句在窗口1中执行，将对应的角色授予对应的用户，实现将一组权限授予用户。 
   ```
   GRANT rs1_select, rs2_update TO u1, u2;  --u1，u2可以对s1的查询权限、对s2的更新权限。
   GRANT rs2_select, rs1_update TO u3, u4;  --u3，u4可以对s2的查询权限、对s1的更新权限。
   ```
   
   
9. 复制以下语句在窗口1中执行，可以查看指定用户绑定的角色。 
   ```
   \du u1;
   ```
   ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000001816069069.png "点击放大")
   
   
10. 重新打开一个会话窗口2，以用户u1连接DWS数据库。 
    ```
    gsql -d gaussdb -h <DWS集群的公网IP> -U u1 -p 8000 -r -W {password};
    ```
    
    
11. 复制以下语句在窗口2中执行，验证用户u1对s1.t1有查询权限而没有更新权限。 
    ```
    SELECT * FROM s1.t1;
    UPDATE s1.t1 SET c2 = 3 WHERE c1 = 1;
    ```
    ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000001769468938.png "点击放大")
    
    
12. 复制以下语句在窗口2中执行，验证用户u1对s2.t1有更新权限。 
    ```
    SELECT * FROM s2.t1;
    UPDATE s2.t1 SET c2 = 3 WHERE c1 = 1;
    ```
    ![](https://support.huaweicloud.com/bestpractice-dws/figure/zh-cn_image_0000001769309266.png "点击放大")
    
    
