
# 通过HSFabric的KeyTab认证实现查询HetuEngine SQL任务
#### 适用场景
- 支持客户端跨网段访问。
- 只需要确保业务侧和HetuEngine服务端HSFabric所在业务节点网络互通，且对外开放HSFabric固定的IP和端口。
- 适用于双平面的网络场景。
 
#### 功能简介
通过KeyTab文件认证方式连接到HetuEngine，组装对应的SQL发送到HetuEngine执行，完成对Hive数据源的增删改查操作。
```
public class JDBCExampleZk {
    private static Properties properties = new Properties();
    private final static String PATH_TO_JAAS_ZK_CONF = JDBCExample.class.getClassLoader()
            .getResource("jaas-zk.conf")
            .getPath();
    private final static String PATH_TO_KRB5_CONF = JDBCExample.class.getClassLoader()
            .getResource("krb5.conf")
            .getPath();
    private final static String PATH_TO_USER_KEYTAB = JDBCExample.class.getClassLoader()
            .getResource("user.keytab")
            .getPath();
    private final static String PATH_TO_HETUSERVER_JKS = JDBCExamplePasswordZK.class.getClassLoader()
            .getResource("hetuserver.jks")
            .getPath();
    private static void init() throws ClassNotFoundException {
        System.setProperty("user.timezone", "UTC");
        System.setProperty("java.security.auth.login.config", PATH_TO_JAAS_ZK_CONF);
        System.setProperty("java.security.krb5.conf", PATH_TO_KRB5_CONF);
        properties.setProperty("user", "hivetest");
        properties.setProperty("SSL", "true");
        properties.setProperty("KerberosConfigPath", PATH_TO_KRB5_CONF);
        properties.setProperty("KerberosPrincipal", "hivetest");
        properties.setProperty("KerberosKeytabPath", PATH_TO_USER_KEYTAB);
        properties.setProperty("SSLTrustStorePath", PATH_TO_HETUSERVER_JKS);
        properties.setProperty("KerberosRemoteServiceName", "HTTP");
        properties.setProperty("tenant", "default");
        properties.setProperty("deploymentMode", "on_yarn");
        properties.setProperty("ZooKeeperAuthType", "kerberos");
        properties.setProperty("ZooKeeperSaslClientConfig", "Client");
        Class.forName("io.XXXsql.jdbc.XXXDriver");
    }
    /**
     * Program entry
     *
     * @param args no need program parameter
     */
    public static void main(String[] args) {
        Connection connection = null;
        ResultSet result = null;
        PreparedStatement statement = null;
        String url = "jdbc:XXX://192.168.1.130:2181,192.168.1.131:2181,192.168.1.132:2181/hive/default?"
            + "serviceDiscoveryMode=zooKeeper&zooKeeperNamespace=hsbroker";
        try {
            init();
            String sql = "show tables";
            connection = DriverManager.getConnection(url, properties);
            statement = connection.prepareStatement(sql.trim());
            result = statement.executeQuery();
            ResultSetMetaData resultMetaData = result.getMetaData();
            Integer colNum = resultMetaData.getColumnCount();
            for (int j = 1; j <= colNum; j++) {
                System.out.print(resultMetaData.getColumnLabel(j) + "\t");
            }
            System.out.println();
            while (result.next()) {
                for (int j = 1; j <= colNum; j++) {
                    System.out.print(result.getString(j) + "\t");
                }
                System.out.println();
            }
        } catch (SQLException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (result != null) {
                try {
                    result.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
```
上述代码中各参数说明如[表1]所示：
 表1参数及参数说明 
| 参数名称                            | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
|:---|:---|
| url                             | jdbc:*XXX* ://*zkNode1_IP* :*zkNode1_Port* ,*zkNode2_IP* :*zkNode2_Port* ,*zkNode3_IP* :*zkNode3_Port* /*catalog* /*schema*?serviceDiscoveryMode=zooKeeper\&zooKeeperNamespace=hsbroker 说明： - XXX：驱动名，请以实际样例代码中的内容为准。  - *catalog* 、*schema*分别是JDBC客户端要连接的catalog和schema名称。  - *zkNode_IP* :*zkNode_Port*是ZooKeeper的URL，多个URL以逗号隔开。例如："192.168.81.37:2181,192.168.195.232:2181,192.168.169.84:2181"。   |
| user                            | 访问HetuEngine的用户名，即在集群中创建的"人机"用户的用户名。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| socksProxy                      | SOCKS代理服务器，如"localhost:1080"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| httpProxy                       | HTTP代理服务器地址，如"localhost:8888"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| applicationNamePrefix           | 要附加到任何指定的ApplicationName客户端信息属性的前缀，该属性用于设置HetuEngine查询的源名称，如果既未设置此属性也未设置ApplicationName，则查询的源将为HetuEngine JDBC。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| accessToken                     | 基于令牌的身份验证令牌。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| SSL                             | 是否使用HTTPS连接，默认为"false"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| SSLKeyStorePath                 | Java Keystore文件路径。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| SSLKeyStorePassword             | Java KeyStore密码。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| SSLTrustStorePath               | Java TrustStore文件路径。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| SSLTrustStorePassword           | Java TrustStore密码。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| KerberosRemoteServiceName       | Kerberos服务名称，固定为"HTTP"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| KerberosPrincipal               | KerberosKeytabPath指定的keytab对应的用户名。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| KerberosUseCanonicalHostname    | 是否使用规范化主机名，默认为"false"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| KerberosConfigPath              | 访问数据源用户的krb5配置文件，参考[配置HetuEngine应用安全认证](https://support.huaweicloud.com/devg-lts-mrs/mrs_07_100010.html)获取。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| KerberosKeytabPath              | 访问数据源用户的keytab配置文件，参考[配置HetuEngine应用安全认证](https://support.huaweicloud.com/devg-lts-mrs/mrs_07_100010.html)获取。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| KerberosCredentialCachePath     | Kerberos credential缓存路径。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| extraCredentials                | 用于连接外部的额外凭据。extraCredentials是键值对的列表，如foo:bar;abc:xyz将创建凭据abc = xyz和foo = bar。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| java.security.auth.login.config | "jaas-zk.conf"配置文件的路径，用于访问安全模式下的ZooKeeper。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| java.security.krb5.conf         | krb5配置文件，参考[配置HetuEngine应用安全认证](https://support.huaweicloud.com/devg-lts-mrs/mrs_07_100010.html)获取。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| ZooKeeperAuthType               | ZooKeeper的认证方式，安全模式下取值为"kerberos"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| ZooKeeperSaslClientConfig       | "jaas-zk.conf"配置文件中的条目名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| tenant                          | 用户所属的租户。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| deploymentMode                  | 只支持on_yarn。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   
