
# GeminiDB兼容DynamoDB接口鉴权
在企业级应用中，不同部门或用户角色对数据的访问需求各不相同，如果不对GeminiDB兼容DynamoDB接口的访问权限进行管理，可能会导致数据泄露或被误操作。GeminiDB兼容DynamoDB接口鉴权适用于需要限制不同角色对数据的操作范围的场景。使用者可以通过创建多个GeminiDB兼容DynamoDB接口用户并赋予不同的权限，对GeminiDB兼容DynamoDB接口实例的查询、写入等行为进行表级别的细粒度控制，从而提高数据的安全性以及保护敏感数据。通过合理设置权限，GeminiDB兼容DynamoDB接口可以在多租户或企业环境中实现数据的隔离和访问管理。
#### GeminiDB兼容DynamoDB接口支持的权限
鉴权功能支持通过GeminiDB兼容DynamoDB接口的API来控制表级别的部分权限（不支持更细粒度的权限控制，例如行或列级别），如[支持的权限及其范围]所示。
 表1支持的权限及其范围 
| 权限类型   | 权限范围          | 语义          |
|:---|:---|:---|
| CREATE | ALL KEYSPACES | 创建任意名称的表    |
| ALTER  | TABLE         | 修改特定名称的表的配置 |
| DROP   | TABLE         | 删除特定名称的表    |
| SELECT | TABLE         | 查询特定名称的表数据  |
| MODIFY | TABLE         | 写入特定名称的表数据  |
   
#### 使用cql语句设置用户权限
- 创建新用户
  ```
  -- 创建普通用户
  CREATE USER <username> WITH PASSWORD 'your_password' NOSUPERUSER;
  ```
  ![](https://support.huaweicloud.com/dynamodbug-nosql/public_sys-resources/note_3.0-zh-cn.png)
  - 新创建的用户未授权前没有任何权限。
  
  - 新用户密码必须为8\~32位，必须是大写字母、小写字母、数字、特殊字符中至少两种的组合，其中可输入\~!@#%\^\*-_=+?特殊字符。更多信息，请参见[修改GeminiDB兼容DynamoDB管理员密码](https://support.huaweicloud.com/dynamodbug-nosql/nosql_dynamodb_0067.html)。
    
- 为用户添加权限
  ```
  -- 赋予用户创建表权限：
  GRANT CREATE ON ALL KEYSPACES TO <username>;
  ```
  ```
  -- 赋予用户表级别查询权限：
  GRANT SELECT ON TABLE <table_name>.<table_name> TO <username>;
  ```
  ```
  -- 赋予用户表级别插入/更新/删除权限：
  GRANT MODIFY ON TABLE <table_name>.<table_name> TO <username>;
  ```
  
- 查看用户权限
  ```
  LIST ALL PERMISSIONS OF <username>;
  ```
  
- 移除用户权限
  ```
  -- 撤销用户对某个表的 SELECT 权限
  REVOKE SELECT ON TABLE <table_name>.<table_name> FROM <username>;
  ```
  ```
  -- 撤销用户对某个 keyspace 的所有权限
  REVOKE ALL PERMISSIONS ON KEYSPACE <table_name> FROM <username>;
  ```
  
- 删除用户
  ```
  DROP USER <username>;
  ```
  ![](https://support.huaweicloud.com/dynamodbug-nosql/public_sys-resources/note_3.0-zh-cn.png)
  - 创建实例时预置的用户rwuser，拥有创建所有表的权限。
  
  - 创建表的用户，默认拥有该表全部权限。
  
  - 推荐使用rwuser执行DynamoDB表和用户创建操作，再为新创建的用户赋予不同权限，以实现权限控制。
    
 
#### GeminiDB兼容DynamoDB接口对应的用户权限
表2接口的用户权限 
| GeminiDB兼容DynamoDB接口名称 | 用户权限                 |
|:---|:---|
| BatchGetItem           | 表级别SELECT            |
| BatchWriteItem         | 表级别MODIFY            |
| CreateTable            | ALL KEYSPACES CREATE |
| DeleteItem             | 表级别MODIFY            |
| DeleteTable            | 表级别DROP              |
| DescribeStream         | 无需任何权限               |
| DescribeTimeToLive     | 无需任何权限               |
| DescribeTable          | 无需任何权限               |
| GetItem                | 表级别SELECT            |
| GetRecords             | 表级别SELECT            |
| GetShardIterator       | 无需任何权限               |
| ListStreams            | 无需任何权限               |
| ListTables             | 无需任何权限               |
| PutItem                | 表级别MODIFY            |
| Query                  | 表级别SELECT            |
| Scan                   | 表级别SELECT            |
| UpdateItem             | 表级别MODIFY            |
| UpdateTable            | 表级别ALTER             |
| UpdateTimeToLive       | 表级别ALTER             |
   
#### 鉴权失败报错信息
```
{
    "__type": "AccessDeniedException",
    "message": "User <user_name> has no <permission_name> permission on <data_resource> or any of its parents"
}
```
#### GeminiDB兼容DynamoDB接口其他权限控制
- [通过IAM角色或策略授予使用GeminiDB兼容DynamoDB的权限](https://support.huaweicloud.com/dynamodbug-nosql/nosql_dynamodb_0131.html)
- [通过IAM身份策略授予使用GeminiDB兼容DynamoDB的权限](https://support.huaweicloud.com/dynamodbug-nosql/nosql_dynamodb_0132.html)
 
