更新时间:2024-05-27 GMT+08:00

使用keytab文件进行JDBC认证

功能简介

使用keytab文件进行JDBC认证。

准备操作

登录FusionInsight Manager,选择“系统 > 权限 > 用户”,下载参考准备MRS应用开发用户准备的开发用户的认证凭据。

代码样例

以下代码片段仅为演示,具体代码参见“com.huawei.bigdata.iotdb.JDBCbyKerberosExample”类。

  • 在Manager界面,选择“集群 > 服务 > IoTDB > 实例”,查看待连接的IoTDBServer所在的节点IP。
  • RPC端口可通过登录FusionInsight Manager,选择“集群 > 服务 > IoTDB > 配置 > 全部配置”,搜索参数“IOTDB_SERVER_RPC_PORT”获得。
  • 安全模式下,登录IoTDBServer所在节点的用户名和密码由FusionInsight Manager统一控制,参考准备MRS应用开发用户,确保该用户具有操作IoTDB服务的角色权限。
  • 本端域可以在Manager界面,选择“系统 > 域与互信 > 本端域 ”中查看。
package com.huawei.bigdata.iotdb;

import com.huawei.iotdb.client.security.IoTDBClientKerberosFactory;
import org.apache.iotdb.jdbc.IoTDBSQLException;
import org.ietf.jgss.GSSException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Base64;
import javax.security.auth.login.LoginException;

public class JDBCbyKerberosExample {

   /**
    * 安全模式下,“SSL_ENABLE”默认为“true”,需要导入truststore.jks文件。
    * 安全模式下,也可登录FusionInsight Manager,选择“集群 > 服务 > IoTDB > 配置”,在搜索框中搜索“SSL”,修改“SSL_ENABLE”参数值为“false”;保存配置后需重启IoTDB服务使配置生效。并修改客户端“客户端安装目录/IoTDB/iotdb/conf”目录下的“iotdb-client.env”文件中的配置:iotdb_ssl_enable="false"。
    */
    private static final String IOTDB_SSL_ENABLE = "true"; //该值为“SSL_ENABLE”参数值。

    private static final String JAVA_KRB5_CONF = "java.security.krb5.conf";
    /**
     * Location of krb5.conf file
     */
    private static final String KRB5_CONF_DEST = "下载的认证凭据中“krb5.conf”文件的位置";
    /**
     * Location of keytab file
     */
    private static final String KEY_TAB_DEST = "下载的认证凭据中“user.keytab”文件的位置";
    /**
     * User principal
     */
    private static final String CLIENT_PRINCIPAL = "用户的Principal(通常为“用户名@本端域”,例如:iotdb_admin@HADOOP.COM)";
   /** 
    * Server principal, 'iotdb_server_kerberos_principal' in iotdb-datanode.properties
    */
    private static final String SERVER_PRINCIPAL = "iotdb/hadoop.hadoop.com@HADOOP.COM";//该参数值可在任意安装了IoTDB服务的节点的“${BIGDATA_HOME}/FusionInsight_IoTDB_*/*_*_IoTDBServer/etc/iotdb-datanode.properties”中搜索“iotdb_server_kerberos_principal”获取。

    /**
     * Get kerberos token as password
     * @return kerberos token
     * @throws LoginException loginException
     * @throws GSSException GSSException
     */
    public static String getAuthToken() throws LoginException, GSSException {
        IoTDBClientKerberosFactory kerberosHandler = IoTDBClientKerberosFactory.getInstance();
        System.setProperty(JAVA_KRB5_CONF, KRB5_CONF_DEST);
        kerberosHandler.loginSubjectFromKeytab(PRINCIPAL, KEY_TAB_DEST);
        byte[] tokens = kerberosHandler.generateServiceToken(PRINCIPAL);
        return Base64.getEncoder().encodeToString(tokens);
    }

    public static void main(String[] args) throws SQLException {
        // set iotdb_ssl_enable
        System.setProperty("iotdb_ssl_enable", IOTDB_SSL_ENABLE);
        if ("true".equals(IOTDB_SSL_ENABLE)) {  
          // set truststore.jks path  
          System.setProperty("iotdb_ssl_truststore", "truststore文件路径");
        }

        try (Connection connection =
                        DriverManager.getConnection("jdbc:iotdb://IoTDBServer实例节点IP地址:端口/", "认证用户名", getAuthToken());
                Statement statement = connection.createStatement()) {
            // set JDBC fetchSize
            statement.setFetchSize(10000);

            try {
                statement.execute("SET STORAGE GROUP TO root.sg1");
                statement.execute(
                        "CREATE TIMESERIES root.sg1.d1.s1 WITH DATATYPE=INT64, ENCODING=RLE, COMPRESSOR=SNAPPY");
                statement.execute(
                        "CREATE TIMESERIES root.sg1.d1.s2 WITH DATATYPE=INT64, ENCODING=RLE, COMPRESSOR=SNAPPY");
                statement.execute(
                        "CREATE TIMESERIES root.sg1.d1.s3 WITH DATATYPE=INT64, ENCODING=RLE, COMPRESSOR=SNAPPY");
            } catch (IoTDBSQLException e) {
                System.out.println(e.getMessage());
            }
        } catch (GSSException | LoginException e) {
            System.out.println(e.getMessage());
        }
    }
}