# 配置JDBC连接（使用IAM认证方式）
#### 概述
DWS提供了使用IAM认证方式访问数据库的功能。当使用JDBC应用程序连接集群时，您可以在JDBC连接中配置IAM用户名及其用户凭证等信息，在连接数据库时系统就会自动生成临时数据库凭证，从而成功连接到数据库。当前仅支持1.3.1及以上版本的集群及其配套的JDBC驱动程序使用IAM认证方式访问数据库。请先参考[下载JDBC或ODBC驱动](https://support.huaweicloud.com/mgtg-dws/dws_01_0032.html)下载JDBC驱动程序。
IAM用户凭证有密码和访问密钥（Access Key ID和Secret Access Key，简称AK和SK）两种类型，您要为JDBC连接提供IAM访问密钥。
如需使用IAM用户凭证访问数据库，必须先给您的IAM用户授予DWS Database Access权限，同时拥有DWS Administrator和DWS Database Access权限的用户，才能基于IAM用户生成临时数据库用户凭证以连接DWS数据库。
需要注意的是，DWS Database Access是用户组级别的权限，您可以通过为用户组授权并将用户加入到用户组的方式，使用户具有用户组中的权限。
在IAM中，只有admin用户组的用户可以管理用户。如需给IAM用户授权，您的IAM账号必须属于IAM的admin用户组，否则，请联系IAM账号管理员帮您授权。
使用IAM用户凭证访问数据库的流程如下：
1. [授予IAM用户DWS Database Access权限]
2. [创建IAM用户凭证]
3. [配置JDBC连接使用IAM认证方式连接集群]
 
 #### 授予IAM用户DWS Database Access权限
1. [登录IAM管理控制台](https://console.huaweicloud.com/iam)。
2. 修改您的IAM用户所属的用户组，给用户组设置策略，授予用户组DWS Database Access权限，并将您的IAM用户添加到该IAM用户组中。 
   只有IAM的admin用户组的用户才能执行此步骤。在IAM中，只有admin用户组的用户可以管理用户，包括创建用户组及用户、设置用户组权限等。
   具体操作请参见《统一身份认证服务用户指南》中的[查看或修改用户组](https://support.huaweicloud.com/usermanual-iam/iam_03_0003.html)。
   您也可以新创建一个IAM用户组，并给用户组设置策略，授予用户组**DWS Administrator** 和**DWS Database Access** 权限，然后将您的IAM用户添加到该IAM用户组中。具体操作请参见《统一身份认证服务用户指南》中的[创建用户组并授权](https://support.huaweicloud.com/usermanual-iam/iam_03_0001.html)。
   
   
 
 #### 创建IAM用户凭证
用户可以登录管理控制台创建访问密钥，如果您已经创建过了，也可以使用已有的访问密钥。每个访问密钥权限相同，相互独立，包括一对AK/SK，有效期为永久，**每个访问密钥仅能下载一次**。为了账号安全性，建议您定期更换并妥善保存访问密钥。
1. [登录DWS管理控制台](https://console.huaweicloud.com/dws)。
2. 将鼠标移到右上角的用户名，单击**"我的凭证"**。
3. 再单击**"访问密钥"** 页签，可以查看已有的访问密钥，也可以单击**"新增访问密钥"** 进行创建。
   
   访问密钥是IAM身份认证的重要凭证，只有在新增访问密钥时，用户才可以下载到含有Access Key ID（AK）和Secret Access Key（SK）的密钥文件，在管理控制台只能查看到Access Key ID，如果您未曾下载过该密钥文件，请联系您的管理员进行获取，或者重新创建。
   
   
4. （可选）每个用户最多可创建2个访问密钥，不支持增加配额。如果需要新增访问密钥的方法为**删除旧访问密钥，然后重新生成** 。详情请参见[访问密钥](https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html)。
 
 #### 配置JDBC连接使用IAM认证方式连接集群
**配置JDBC连接参数**
表1数据库连接参数 
| 参数      | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
|:---|:---|
| url    | gsjdbc4.jar/gsjdbc200.jar数据库连接描述符。JDBC接口不提供重试连接的能力，您需要在业务代码中实现重试连接的处理。url示例如下： ``` jdbc:dws:iam://dws-IAM-demo:cn-north-4/gaussdb?AccessKeyID=XXXXXXXXXXXXXXXXXXXX&SecretAccessKey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&DbUser=user_test&AutoCreate=true ``` **JDBC URL参数说明：** - jdbc:dws:iam是URL格式的前缀。  - dws-IAM-demo为数据库集群名称。  - **cn-north-4** 是集群所在的区域。JDBC会根据所填写区域，访问对应DWS服务，向所在集群下发IAM证书，用于IAM用户认证。DWS服务地址已内置在JDBC配置文件中。 有关DWS的区域信息，请参考[地区和终端节点](https://developer.huaweicloud.com/endpoint)。   - gaussdb是要连接的数据库名。  - **AccessKeyID/SecretAccessKey**为参数DbUser指定的IAM用户所对应的访问密钥ID和秘密访问密钥。  - **DbUser** 请设置为IAM用户名，注意，当前版本暂不支持IAM用户名中含有中划线的情况。 - 如果数据库中已存在DbUser指定的用户，则临时用户凭证具有与现有用户相同的权限。  - 如果数据库中不存在DbUser指定的用户，且AutoCreate参数值为true，则自动创建一个以DbUser参数值作为用户名的新用户，默认创建的用户为数据库普通用户。    - **AutoCreate** 可以不设置，默认为false。该参数表示是否在数据库中自动创建一个以DbUser参数值作为用户名的数据库用户。 - true表示自动创建。如果用户已存在则不再创建。  - false表示不会自动创建。如果数据库中不存在DbUser指定的用户名将返回失败。    - **addressType** 连接使用的地址类型，默认为auto。 - auto：自动选择IP连接。表示自动选取IP进行连接，优先级EIP \> ELB \> 私有IP。  - eip：使用弹性公网IP连接。  - elb：使用弹性负载均衡连接，优先级elb_public \> elb_private。  - elb_public：使用弹性负载均衡公网IP连接。  - elb_private：使用弹性负载均衡私网连接。     |
| info | 数据库连接属性。常用的属性如下： - **ssl**：Boolean类型。表示是否使用SSL连接。  - **loglevel** ：Integer类型。为LogStream或LogWriter设置记录进DriverManager当前值的日志信息量。 目前支持org.postgresql.Driver.DEBUG和org.postgresql.Driver.INFO。值为1时，表示只打印org.postgresql.Driver.INFO，将记录非常少的信息。值大于等于2时，表示打印org.postgresql.Driver.DEBUG和org.postgresql.Driver.INFO，将产生详细的日志信息。默认值为0，表示不打印日志。   - **charSet**：String类型。表示在向数据库发送数据或从数据库接收数据时使用到的字符集。  - **prepareThreshold**：Integer类型。用于确定在转换为服务器端的预备语句之前，要求执行方法PreparedStatement的次数。缺省值是5。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
   
**示例**
```
//以下用例以gsjdbc4.jar为例。
//以下代码将获取数据库连接操作封装为一个接口，可通过给定集群所在的区域、集群名称、AccessKeyID、SecretAccessKey及对应的IAM用户名来连接数据库。
public static Connection getConnection(String clustername, String regionname, String AK, String SK,
    String username) {
    //驱动类。
    String driver = "org.postgresql.Driver";
    //数据库连接描述符。
    String sourceURL = "jdbc:dws:iam://" + clustername + ":" + regionname + "/gaussdb?" + "AccessKeyID="
        + AK + "&SecretAccessKey=" + SK + "&DbUser=" + username + "&autoCreate=true";
    Connection conn = null;
    try {
        //加载驱动。
        Class.forName(driver);
    } catch (ClassNotFoundException e) {
        return null;
    }
    try {
        //创建连接。
        conn = DriverManager.getConnection(sourceURL);
        System.out.println("Connection succeed!");
    } catch (SQLException e) {
        return null;
    }
    return conn;
}
```
