
# 配置Hive单表动态视图的访问控制权限
#### 操作场景
在多租户数据管理场景中，不同用户需要访问同一张表中的不同数据子集。传统的访问控制方式需要为每个用户创建独立的视图，管理复杂且维护成本高。如何在保证数据安全的前提下，简化多用户访问控制的配置？MRS Hive提供基于动态视图的访问控制机制，通过current_user()函数实现单表动态视图，一个视图即可为不同用户自动过滤出对应的数据子集。开启Kerberos认证的MRS Hive可以创建一个视图并控制用户访问权限，支持授权给不同的用户访问，同时限定不同用户只能访问各自的数据。
本文介绍如何配置Hive单表动态视图的访问控制权限。
- **动态视图（Dynamic View）**：Hive提供的一种视图类型，视图定义中包含current_user()等动态函数，在查询时根据当前用户动态生成查询结果。与静态视图不同，动态视图的查询条件会随用户身份变化。
- **current_user()函数**：Hive内置函数，返回当前执行查询的用户名称。在动态视图中使用该函数，可以实现基于用户身份的数据过滤。
 
#### 约束与限制
- 未开启Kerberos认证的集群的"current_user()"函数无法区别客户端提交任务的用户，因此，当前访问控制仅对开启了Kerberos认证的集群的Hive有效。
- 如果已经在实际业务逻辑中使用了"current_user()"函数，那么，在安全模式（开启了Kerberos认证的集群）与普通模式（未开启Kerberos认证的集群）互转时，需要充分评估可能的风险。
- 动态视图的访问控制依赖于表中的数据字段（如type字段），需要确保表中包含用于区分用户的数据列。
 
#### 前提条件
- 集群已启用Kerberos认证（安全模式）。
- 已安装Hive客户端。
- 已创建具有相应权限的Hive业务用户。
- 基表已创建并包含用于区分用户的数据列。
 
#### 配置Hive视图的访问控制权限
1. 以Hive客户端安装用户登录安装客户端的节点。
2. 执行以下命令，切换到客户端安装目录，配置环境变量并认证用户。 
   切换至客户端安装目录：
   ```
   cd 客户端安装目录
   ```
   加载环境变量：
   ```
   source bigdata_env
   ```
   认证用户：
   ```
   kinit Hive业务用户
   ```
   
   
3. 执行以下命令登录Hive客户端。 
   ```
   beeline
   ```
   
   
4. 配置Hive视图的访问控制权限示例： 
   - 不采用"current_user"函数，要实现不同的用户访问不同数据，需要创建不同的视图：
     - 将视图v1授权给用户hiveuser1，hiveuser1用户可以访问表table1中"type='hiveuser1'"的数据：
       ```
       create view v1 as select * from table1 where type='hiveuser1';
       ```
       
     
     - 将视图v2授权给用户hiveuser2，hiveuser2用户可以访问表table1中"type='hiveuser2'"的数据：
       ```
       create view v2 as select * from table1 where type='hiveuser2';
       ```
       
      
   
   - 采用"current_user"函数，则只需要创建一个视图： 将视图v分别赋给用户hiveuser1、hiveuser2，当hiveuser1查询视图v时，"current_user()"被自动转化为hiveuser1，当hiveuser2查询视图v时，"current_user()"被自动转化为hiveuser2：
     ```
     create view v as select * from table1 where type=current_user();
     ```
     
   
   
   
   
 
**验证操作：**
配置完成后，可通过以下方式验证访问控制是否生效：
1. 使用hiveuser1用户登录beeline，执行以下命令查询视图：
   ```
   select * from v;
   ```
   确认返回的数据仅为type='hiveuser1'的记录。
   
2. 使用hiveuser2用户登录beeline，执行相同的查询命令：
   ```
   select * from v;
   ```
   确认返回的数据仅为type='hiveuser2'的记录。
   
3. 使用hiveuser1用户尝试访问hiveuser2的数据，确认访问被拒绝或返回空结果。
#### 常见问题
- **普通模式下动态视图不生效**
  未开启Kerberos认证的集群（普通模式）无法识别用户身份，current_user()函数无法返回正确的用户名称。
  在普通模式下使用静态视图方式为每个用户创建独立的视图。
  
- **查询视图返回空结果**
  查询视图返回空结果可能是因为基表中没有对应当前用户的数据，或用户名称与type字段值不匹配。
  检查基表中是否存在type字段值等于当前用户名称的数据。确认用户名称拼写正确，大小写敏感。
  
 
#### 相关文档
- 了解Hive数据操作，请参考[Hive客户端使用实践](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_0952.html)。
- 了解如何创建Hive用户并绑定角色，请参考[创建Hive用户并绑定角色](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_0949.html)。
- 了解Hive常见问题，请参考[Hive常见问题](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1752.html)。
 
