hive 配置的官方说明: https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties
认证核心配置:
hive.server2.authentication:
NONE: no authentication check – plain SASL transport
LDAP: LDAP/AD based authentication
KERBEROS: Kerberos/GSSAPI authentication
CUSTOM: Custom authentication provider (use with property hive.server2.custom.authentication.class )
PAM: Pluggable authentication module (added in Hive 0.13.0 with HIVE-6466)
NOSASL: Raw transport (added in Hive 0.13.0)
说明: 认证类需要继承于org.apache.hive.service.auth.PasswdAuthenticationProvider 实现里面的Authenticate接口 更详细的说明 可以参考源代码: https://github.com/apache/hive/blob/master/service/src/java/org/apache/hive/service/auth/PasswdAuthenticationProvider.java
package org.sptk.auth;
import org.apache.hive.service.auth.PasswdAuthenticationProvider;
import javax.security.sasl.AuthenticationException;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
// 这里的认证编写是基于配置文件密码的认证方式, 基于配置中的明文密码做的认证, 更复杂的逻辑 可以基于实际需求在编写
// 这里的认证默认会加载 hive的配置目录中的 passpwd文件
public class PwdAuth implements PasswdAuthenticationProvider {
private static String PASSWD_FILE = ""; // 你可以改成 hive-site.xml 配置
private static final Map<String, String> userMap = new HashMap<>();
static {
try {
getPWDFile();
} catch (AuthenticationException e) {
throw new RuntimeException(e);
}
loadUsers();
}
private static void getPWDFile() throws AuthenticationException {
// 检查下hive home 是否存在
String hiveHome = System.getenv("HIVE_HOME");
if (hiveHome == null) {
final String HIVE_HOME_ERR = "Hive Home not set !, default pwd file in $HIVE_HOME/conf/passpwd";
throw new AuthenticationException(HIVE_HOME_ERR);
}
final Pattern cmp = Pattern.compile("(.+?)/*$");
final Matcher m = cmp.matcher(hiveHome.trim());
m.find();
// 拼接pwd file 路径
PASSWD_FILE = m.group(1) + "/conf/passpwd";
}
private static void loadUsers() {
try (BufferedReader br = new BufferedReader(new FileReader(PASSWD_FILE))) {
String line;
while ((line = br.readLine()) != null) {
if (line.trim().isEmpty() || line.startsWith("#")) {
continue; // 跳过空行和注释
}
String[] parts = line.split("=", 2);
if (parts.length == 2) {
userMap.put(parts[0].trim(), parts[1].trim());
}
}
} catch (IOException e) {
System.err.println("加载 passwd 文件失败: " + e.getMessage());
}
}
@Override
public void Authenticate(String user, String password) throws AuthenticationException {
if (userMap.containsKey(user) && userMap.get(user).equals(password)) {
return; // 验证通过
}
throw new AuthenticationException("认证失败: 用户名或密码错误!");
}
}
增加hive-site的配置
<property>
<name>hive.server2.authentication</name>
<value>CUSTOM</value>
</property>
<property>
<name>hive.server2.custom.authentication.class</name>
<value>org.sptk.auth.PwdAuth</value>
</property>
说明: 你使用的hive版本是那个, 这里调整对应的hive-service版本
<?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>org.sptk</groupId>
<artifactId>pwdauth</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-service</artifactId>
<version>3.1.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 打包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
# 这里我们的包名是 org.sptk.auth.PwdAuth
# 打包好的jar包版本基于hive3.1.2
# 下载地址: 通过网盘分享的文件:pwdauth.jar
# 链接: https://pan.baidu.com/s/1SAqykGmQv7boCNNoDu858g?pwd=56tb 提取码: 56tb
注意: hive.server2.custom.authentication.class 配置成自己打包的包名称
<property>
<name>hive.server2.authentication</name>
<value>CUSTOM</value>
</property>
<property>
<name>hive.server2.custom.authentication.class</name>
<value>org.sptk.auth.PwdAuth</value>
</property>
$HIVE_HOME/conf/passpwd
文件说明: HIVE_HOME 你hive的安装目录, 一定要配置下环境变量, 因为认证类默认读取这个变量 passpwd 米文件, 文件格式: 用户名=密码
passpwd示例:
root=admin123@!#
test=123456
# 如果是root用户, 我们可以不做更改,一般情况我们搭建的时候 都是root用户
# 如果是其他用户我们需要基于hdfs做授权, 因为其他用户没有读写hdfs的权限
hdfs dfs -chmod -R 777 /tmp # 默认所有用户都要使用
# 配置其他的权限, 例如: 某些数据库权限等
hdfs dfs -setfacl -R -m user:test:rwx 数据库的路径
# 根据你自己的启动方式重启下hive服务即可 可以先关闭再启动
# 启动命令
nohup hive --service hiveserver2&
:thumbsup: 到这里你已经完成了 自定义登录认证方式了
<property>
<name>hive.server2.authentication</name>
<value>PAM</value>
</property>
<property>
<name>hive.server2.authentication.pam.services</name>
<value>hive</value> <!-- 指定PAM服务名,对应/etc/pam.d/hive配置文件 -->
</property>
/etc/pam.d/hive
, 这个文件需要我们自己创建# /etc/pam.d/hive 内容
auth required pam_unix.so
account required pam_unix.so
# 1. 检查hiveserver2 启动的java.library.path的路径
ps -ef | grep hiveserver2 | grep -Po "java.library.path=[^\s]+" # 类似结果 java.library.path=/export/server/hadoop-3.3.0/lib/native
# 2. 确定是否有对应的so文件, 如果能匹配说明有 [很大的可能是没有的]
ls /export/server/hadoop-3.3.0/lib/native | grep libjpam.so
# 3. 下载动态库 https://sourceforge.net/projects/jpam/files/jpam/jpam-1.1/ 下载对应版本的jpam版本 `JPam-Linux_amd64-1.1.tgz` 我这里是linux 64位
# 4. 拷贝libjpam.so 到我们的 java.library.path 对应的路径中
# 基于安全考虑,这里增加一个非登录的linux用户, 用于用于验证hive登录 mytest是用于登录的用户名
useradd -r -s /sbin/nologin -M -c "hiveserver2 login" mytest
# 设置密码mytest的登录密码
passpwd mytest
0