<property>
<name>hive.server2.authentication</name>
<value>CUSTOM</value>
</property>
<property>
<name>hive.server2.custom.authentication.class</name>
<value>com.shuangyu.hive.auth.CustomHiveServer2Auth</value>
</property>
需要对访问hive做用户密码验证,网上搜了下要自己重写接口,并做如上的配置,重启后发现根本就没生效啊,随便输个用户和密码都能进去。
开始以为是配置错了地方,然后把client端和server端,server2都配置了还是没有任何反应(用的cdh,配置有分client端server端),下面是根据网上教程copy来的验证代码。各位大大帮忙看下,是哪里出问题了。
[mw_shl_code=java,true]package com.shuangyu.hive.auth;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.security.sasl.AuthenticationException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hive.service.auth.PasswdAuthenticationProvider;
/**
* Description:
* Creator:╰⊱⋛⋋ShuangYu⋌⋚⊰╯
* CreateTime: 2018/2/8.
* Remark:
* Usage:
* Example:
* ✻
*/
public class CustomHiveServer2Auth implements PasswdAuthenticationProvider{
@Override
public void Authenticate(String username, String password)
throws AuthenticationException {
boolean ok = false;
String passMd5 = new MD5().md5(password);
HiveConf hiveConf = new HiveConf();
Configuration conf = new Configuration(hiveConf);
// String filePath = conf.get("hive.server2.custom.authentication.file");
String filePath = "/tmp/sljr_hive.conf";
System.out.println("hive.server2.custom.authentication.file [" + filePath + "] ..");
File file = new File(filePath);
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(file));
String tempString = null;
while ((tempString = reader.readLine()) != null) {
String[] datas = tempString.split(",", -1);
if(datas.length != 2) continue;
//ok
if(datas[0].equals(username) && datas[1].equals(passMd5)) {
ok = true;
break;
}
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
throw new AuthenticationException("read auth config file error, [" + filePath + "] ..", e);
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {}
}
}
if(ok) {
System.out.println("user [" + username + "] auth check ok .. ");
} else {
System.out.println("user [" + username + "] auth check fail .. ");
throw new AuthenticationException("user [" + username + "] auth check fail .. ");
}
}
//MD5加密
class MD5 {
private MessageDigest digest;
private char hexDigits[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
public MD5() {
try {
digest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
public String md5(String str) {
byte[] btInput = str.getBytes();
digest.reset();
digest.update(btInput);
byte[] md = digest.digest();
// 把密文转换成十六进制的字符串形式
int j = md.length;
char strChar[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md;
strChar[k++] = hexDigits[byte0 >>> 4 & 0xf];
strChar[k++] = hexDigits[byte0 & 0xf];
}
return new String(strChar);
}
}
}
[/mw_shl_code]
额,配置在server端时链接有报错:
[cloudera@quickstart hive]$ beeline
Beeline version 1.1.0-cdh5.12.0 by Apache Hive
beeline> !connect jdbc:hive2://192.168.10.207:10000/default
scan complete in 3ms
Connecting to jdbc:hive2://192.168.10.207:10000/default
Enter username for jdbc:hive2://192.168.10.207:10000/default: asdf
Enter password for jdbc:hive2://192.168.10.207:10000/default: ***
Unexpected end of file when reading from HS2 server. The root cause might be too many concurrent connections. Please ask the administrator to check the number of active connections, and adjust hive.server2.thrift.max.worker.threads if applicable.
Error: Could not open client transport with JDBC Uri: jdbc:hive2://192.168.10.207:10000/default: null (state=08S01,code=0)
我用的是自己的虚拟机,就我一个人用户,所以应该不存在链接过多(链接数配置的1000)
|