1、Ranger中对Hive的库、表、列进行授权

在做Hive的访问权限控制的时候,Ranger中对hive中添加了如下Policy权限控制。配置方式如下:

2、默认情况下,Ambari中hiveserver2的HiveServer2 Authentication默认是None,如下:


所以发现在服务器上进行访问hive的时候(类似:hive -n userName -p pwd),发现pwd随便写,都可以进入hive中。这个显然是有问题的。

为了解决上面的问题,这里,我们自己定义HiveServer2 Authentication的认证方式。

3、建立custome认证hive server2的工程,工程结构如下:

3.1 pom.xml如下

<?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>com.xxx</groupId><artifactId>custom-hiveserver2-auth</artifactId><version>1.0-SNAPSHOT</version><properties><mysql.jdbc.version>5.1.34</mysql.jdbc.version><hadoop-common.version>3.1.0</hadoop-common.version><hive-common.version>3.1.0</hive-common.version><commons-logging.version>1.2</commons-logging.version></properties><dependencies><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>${hadoop-common.version}</version><scope>provided</scope></dependency><dependency><groupId>org.apache.hive</groupId><artifactId>hive-common</artifactId><version>${hive-common.version}</version><scope>provided</scope></dependency><dependency><groupId>org.apache.hive</groupId><artifactId>hive-service</artifactId><version>${hive-common.version}</version><scope>provided</scope></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>${commons-logging.version}</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.jdbc.version}</version><scope>provided</scope></dependency></dependencies></project>

3.2 custom.auth.jdbc.properties的内容如下:

mysql.jdbc.url=jdbc:mysql://xxx.xxx.xxx.xxx:3306/xxx?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf8
mysql.jdbc.user=root
mysql.jdbc.password=xxx
mysql.jdbc.driverClass=com.mysql.jdbc.Driver

3.3 MySqlJdbcUtils的内容如下:

package com.xxx.hive.custom.utils;import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;/*** <p>* 功能:连接mysql的公共工具类* </p>** @author tuzq* Copyright 2018 xxx.com, Inc. All rights reserved* @version v1.0*/
public class MySqlJdbcUtils {/** 数据库url **/private static String URL = null;/** 数据库用户名 **/private static String USER = null;/** 密码 **/private static String PWD = null;/** 数据库的driver **/private static String DRIVER_CLASS = null;public MySqlJdbcUtils(String jdbcConfigFile) {try {Properties prop = new Properties();prop.load(new FileInputStream(jdbcConfigFile));URL = prop.getProperty("mysql.jdbc.url");USER = prop.getProperty("mysql.jdbc.user");PWD = prop.getProperty("mysql.jdbc.password");DRIVER_CLASS = prop.getProperty("mysql.jdbc.driverClass");//注册驱动Class.forName(DRIVER_CLASS);} catch (Exception e) {throw new ExceptionInInitializerError(e);}}/*** 获取与指定数据库的连接* @return 获取连接* @throws SQLException 获取连接异常*/public Connection getConnection() throws SQLException {Connection connection = DriverManager.getConnection(URL,USER,PWD);return connection;}/*** 释放资源* @param rs    :结果集对象* @param stmt  :Statement* @param conn  :连接*/public void release(ResultSet rs, Statement stmt,Connection conn) {//判断结果集是否为空,如果不为空,关闭清空if (null != rs) {try {rs.close();} catch (Exception e) {e.printStackTrace();}rs = null;}if (null != stmt) {try {stmt.close();} catch (Exception e) {e.printStackTrace();}stmt = null;}if (null != conn) {try {conn.close();} catch (Exception e) {e.printStackTrace();}conn = null;}}}

3.4 CustomHiveServer2Auth的内容如下

package com.xxx.hive.custom.auth;import com.xxx.hive.custom.utils.MySqlJdbcUtils;
import com.xxx.hive.custom.utils.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hive.service.auth.PasswdAuthenticationProvider;import javax.security.sasl.AuthenticationException;
import java.sql.*;public class CustomHiveServer2Auth implements PasswdAuthenticationProvider {private static final Log log = LogFactory.getLog(CustomHiveServer2Auth.class);@Overridepublic void Authenticate(String username, String password)throws AuthenticationException {HiveConf hiveConf = new HiveConf();Configuration conf = new Configuration(hiveConf);String filePath = conf.get("hive.server2.custom.authentication.jdbc.config.path");log.info("hive.server2.custom.authentication.jdbc.config.path = " + filePath);if (StringUtils.isBlank(filePath)) {throw new AuthenticationException("jdbc config path is null");}Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;Boolean flag = false;MySqlJdbcUtils jdbcUtils = new MySqlJdbcUtils(filePath);try {conn = jdbcUtils.getConnection();String sql = "select " +"     ranger_user_name, " +"     ranger_password, " +"     exec_password" +" FROM " +"     xxx" +" WHERE " +"     ranger_user_name = ?  and exec_password = ?";pstmt = conn.prepareStatement(sql);pstmt.setString(1,username);pstmt.setString(2,password);rs = pstmt.executeQuery();while (rs.next()) {String name = rs.getString("ranger_user_name");String pwd = rs.getString("exec_password");if (StringUtils.isNotBlank(name) && StringUtils.isNotBlank(pwd) && name.equals(username) && pwd.equals(password)) {flag = true;}}} catch (Exception e) {throw new AuthenticationException("认证hive用户名和密码错误", e);} finally {jdbcUtils.release(rs,pstmt,conn);}if (!flag) {throw new AuthenticationException("认证hive用户名和密码错误");}}}

3.5 将此工程打包

然后将该custom-hiveserver2-auth-1.0-SNAPSHOT.jar包放到/usr/hdp/current/hive-client/lib下,并且远程同步到hadoop4,hadoop5,hadoop6上。

3.6 上传custom.auth.jdbc.properties

将custom.auth.jdbc.properties放到/usr/hdp/current/hive-client/conf目录下。(注意的是每台机器上都要有)

4 配置hive相关,做如下配置:



上面的配置相当于是在hive-site.xml中做如下配置:

<property><name>hive.server2.authentication</name><value>CUSTOM</value>
</property><property><name>hive.server2.custom.authentication.class</name><value>com.xxx.hive.custom.auth.CustomHiveServer2Auth</value>
</property><property><name>hive.server2.custom.authentication.jdbc.config.path</name><value>/usr/hdp/current/hive-client/conf/custom.auth.jdbc.properties</value>
</property>

经过上面的配置之后,一定要重新启动hiveserver2,否则会发现自定义HiveServer2 Authentication Custom的功能不起作用。

打个赏呗,您的支持是我坚持写好博文的动力。

Ranger中对hive添加policy字后,hive登录用户可用,hive密码不管用的问题解决,HiveServer2 Authentication Custom的编写相关推荐

  1. DGI Hive Prohibition Policy(Ranger)

    介绍 Apache Ranger为Enterprise Hadoop生态系统提供集中安全性,包括细粒度访问控制和集中审计.在ranger-0.5版本中,Apache Ranger引入了堆栈模型,使新组 ...

  2. cdh的hive配置中,修改 添加 hive-site.xml 配置 hive 增加用户 role 更改权限

    dh的hive配置中,修改 添加 hive-site.xml 配置 CDH版本的hive-site.xml是通过CM配置生成的文件,每次启动,都会根据CM选项还原配置,因此,我们必须用CM界面,找到H ...

  3. ubuntu中解决ROS--Gazebo添加模型库,解决打开后无模型的问题

    ubuntu中解决Gazebo添加模型库,解决打开后无模型的问题 1.在主目录中ctrl+h ​​​​ 下载https://bitbucket.org/osrf/gazebo_models/downl ...

  4. 周末杂谈:在MYSQL中,添加数据行后,使用右外连接查询所有课程的选修情况,要求列出课程编号、课程名称、选修人数,表中没有的课程列值为空的解决方法

    周末杂谈:在MYSQL中,添加数据行后,使用右外连接查询所有课程的选修情况,要求列出课程编号.课程名称.选修人数,表中没有的课程列值为空的解决方法 实验前期准备 course表(课程表) 在其中: c ...

  5. IDEA中Java项目删除Web框架后无法再次添加Web框架解决办法

    1.首先在IntelliJ IDEA 2021.2版本下添加Web框架 (1)鼠标右击项目Suke-->选择:Add Framework Support... (2)勾选Web Applicat ...

  6. hive添加udf函数

    1,临时函数 重启hive后函数失效 1)首先在hive中添加jar包 出现added就是成功了 hive (default)> add jar /opt/hiveudf2.jar ; Adde ...

  7. 将数据追加到html 表格中,将数据添加到数据表中

    将数据添加到数据表中 03/30/2017 本文内容 在创建 DataTable 并使用列和约束定义其结构之后,您可以将新的数据行添加到表中. 要添加新行,可将一个新变量声明为 DataRow 类型. ...

  8. hive sql 报错后继续执行_Hive迁移Presto的技术实践

    本文来自OPPO互联网技术团队,如需要转载,请注明出处及作者.欢迎关注我们的公众号:OPPO_tech hive设计之初,就被定位一款离线数仓产品,虽然Hortonworks喊出了Make Apach ...

  9. 在Service中通过WindowManger添加View的方式来把UI界面显示出来

    整体方案 在Service中通过WindowManger添加View的方式来把UI界面显示出来 业务场景 具体场景 IQOO手机,游戏辅助 这种场景能否使用Activity方式来做 使用activit ...

最新文章

  1. 图的度 知识图谱的一度关系 几度关系
  2. MySQL基本操作及乱码问题的解决方法
  3. 大家好!欢迎来到我的博客!
  4. maven 指定jdk版本打包
  5. iOS OC与JS交互(WebView监听事件)
  6. 富爸爸系列 -- 《财务自由》学习笔记之二
  7. HBase:HBase的rowKey设计技巧
  8. 旅游新纪元紫山缭绕,静思生活
  9. 搭建 WordPress 博客教程(超详细)
  10. 罗马帝国 Ancient Rome 简易修改器
  11. 【WordNet】词典——omw-1.4下载
  12. Android事件总线 EventBus3.0用法学习
  13. 欧洲的计算机博士申请,申请经典案例:欧洲计算机科学专业博士全奖
  14. 计算机进入桌面黑屏怎么办,电脑开机进入桌面就黑屏怎么解决??
  15. 阿里云部署Django项目发送邮件时,端口25,465,587上的坑
  16. led点阵---显示数字或汉字(内含代码+注释+图片)
  17. 实验8-2-10 IP地址转换
  18. 堪称神器的5款电脑软件,建议收藏
  19. jenkins构建触发器设置(定时任务)
  20. 可以提高工作效率的应用工具,你知道几个呢

热门文章

  1. java 手机号码归属地_【原创】Java实现手机号码归属地查询
  2. 读入一个数列和N值,返回按优先级排序的N个数 满足...Python解法
  3. Python多线程和队列结合demo
  4. boost::python::bases相关的测试程序
  5. 使用 Proto 构建了一个简单但功能强大的 lambda 库的测试程序
  6. boost::mpl模块实现if相关的测试程序
  7. GDCM:gdcm::Element的测试程序
  8. Boost:bind绑定和数据成员的测试程序
  9. Boost:等待和通知操作的模糊测试
  10. VTK:可视化算法之MarchingCases