HiveServer2 简单用户/密码身份验证

前言

Hive 通过HiveServer2对外提供服务,HiveServer2 是一种能使客户端执行 Hive 查询的服务。HiveServer2 是 HiveServer1 的改进版,HiveServer1 已经被废弃。HiveServer2 对 HiveServer 进行了重写来解决上述问题。

HiveServer2 作为复合服在单个进程中运行,其中包括基于 Thrift 的 Hive 服务(TCP或HTTP)以及用于 Web UI的 Jetty Web 服务。HiveServer2 可以支持多客户端并发和身份认证。旨在为开放API客户端(如JDBC和ODBC)提供更好的支持。

架构

HiveServer2 实现了一个新的基于 Thrift 的 RPC 接口,该接口可以处理客户端并发请求。当前版本支持 Kerberos,LDAP 以及自定义可插拔身份验证。新的 RPC 接口也是 JDBC 和 ODBC 客户端更好的选择,尤其是对于元数据访问。

hive身份认证的三种方式

NONE:即不做身份校验;

LDAP: 使用基于 LDAP/AD 的用户身份校验;

KERBEROS: 使用 Kerberos/GSSAPI 做身份校验;

CUSTOM:自定义认证

针对当前简单应用场景,采用CUSTOM就可满足

配置CUSTOM身份认证流程

1.首先需要编写用户权限验证的类


import org.apache.hadoop.conf.Configurable;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hive.service.auth.PasswdAuthenticationProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.hadoop.conf.Configuration;

import javax.security.sasl.AuthenticationException;

/**
 * @author liguiping
 * @version 1.0.0
 * @since 2022-09-28 10:00
 **/


public class AuthLogin implements PasswdAuthenticationProvider, Configurable {
    private static Logger LOG = LoggerFactory.getLogger(AuthLogin.class);
    private String user;
    private String pwd;
    private Configuration conf = null;

    public AuthLogin() {
        user = getConf().get("hive.auth.user");
        pwd = getConf().get("hive.auth.pwd");
    }

    @Override
    public void setConf(Configuration configuration) {

    }

    @Override
    public Configuration getConf() {
        if (this.conf == null) {
            HiveConf conf = new HiveConf();
            this.conf = new Configuration(conf);
        }
        return this.conf;
    }

    @Override
    public void Authenticate(String username, String password) throws AuthenticationException {
        if (username == null || password == null) {
            throw new AuthenticationException("error.");
        }
        LOG.info("user: " + username + " try login.");
        if (!user.equals(username)) {
            String message = "user name not exist:";
            throw new AuthenticationException(message);
        } else {
            if (!password.equals(pwd)) {
                String message = "user name and password is mismaPasswdAuthenticationProvidertch. user:" + username;
                throw new AuthenticationException(message);
            }
        }
        LOG.info("user " + username + " login system successfully.");
    }
}

pom依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.li</groupId>
    <artifactId>hive-auth</artifactId>
    <version>1.0</version>

    <dependencies>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>3.3.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-common -->
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-common</artifactId>
            <version>3.1.2</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-service</artifactId>
            <version>3.1.2</version>
        </dependency>
    </dependencies>

</project>

将以上文件打包

mvn install

2.配置及复制jar包

将上面的程序打包的hive-auth-1.0.jar,放到$HIVE_HOME/lib下

配置hive-site.xml,追加以下文件

<property>
    <name>hive.server2.authentication</name>
    <value>CUSTOM</value>
</property>
<property>
    <name>hive.server2.custom.authentication.class</name>
    <value>AuthLogin</value>
</property>
<property>
    <name>hive.auth.user</name>
    <value>admin</value>
</property>
<property>
    <name>hive.auth.pwd</name>
    <value>Aa123456</value>
</property>

hive.auth.user为用户名

hive.auth.pwd为密码