分享

hiveserver2自定义用户认证不生效

grinsky 发表于 2018-2-11 11:26:43 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 5 15750
<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:╰&#8881;&#8923;&#8907;ShuangYu&#8908;&#8922;&#8880;╯
* CreateTime: 2018/2/8.
* Remark:
* Usage:
* Example:
* &#10043;
*/
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)

已有(5)人评论

跳转到指定楼层
qcbb001 发表于 2018-2-11 14:39:04
别使用beeline,好像beeline都不用密码。采用其他方式测试
回复

使用道具 举报

grinsky 发表于 2018-2-11 15:19:16
qcbb001 发表于 2018-2-11 14:39
别使用beeline,好像beeline都不用密码。采用其他方式测试

用tableau链接测试还是一样啊,随便输个密码都能练上去
回复

使用道具 举报

qcbb001 发表于 2018-2-11 21:08:24
定义的用户名和密码是什么,没看到你定义下面属性
[mw_shl_code=xml,true]<property>

<name>hive.server2.custom.authentication.file</name>

<value>../apache-hive-0.13.1-bin/conf/hive.server2.users.conf</value>

</property>[/mw_shl_code]

回复

使用道具 举报

grinsky 发表于 2018-2-12 09:38:17
qcbb001 发表于 2018-2-11 21:08
定义的用户名和密码是什么,没看到你定义下面属性
[mw_shl_code=xml,true]

那个属性注释掉了,我写死了文件路径
String filePath  = "/tmp/sljr_hive.conf";


用户名,密码都是写在文件里的,密码是md5加密后的
zhangsan,5f4dcc3b5aa765d61d8327deb882cf99
回复

使用道具 举报

qcbb001 发表于 2018-2-12 10:58:01
grinsky 发表于 2018-2-12 09:38
那个属性注释掉了,我写死了文件路径
String filePath  = "/tmp/sljr_hive.conf";

1.对于配置项hive.server2.custom.authentication.file,可能不止这里使用到,所以为了排除问题的可能性,最好加上
2.打包是否放在$HIVE_HOME/lib下,是否全部都分发了。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条