hive扩展认证方法

扩展HadoopDefaultAuthenticator类的setConf方法,实现可以代理用户运行的功能,主要需求如下:

1.不传入参数时,按本用户执行

2.传入参数时,按传入参数执行

3.对设置为hdfs用户进行限制

主要更改HiveConf类和HadoopDefaultAuthenticator类

HiveConf增加:

HIVE_USE_CUSTOM_PROXY("use.custom.proxy", false),
HIVE_CUSTOM_PROXY_USER("custom.proxy.user", ""),

更改HadoopDefaultAuthenticator 的setConf方法:

protected String proxyUser;
....
  public void setConf(Configuration conf) {
    UserGroupInformation ugi = null;
     if(HiveConf.getBoolVar(conf,HiveConf.ConfVars.HIVE_USE_CUSTOM_PROXY)){
          proxyUser = HiveConf.getVar(conf, HiveConf.ConfVars.HIVE_CUSTOM_PROXY_USER);
          if(("").equals(proxyUser)||proxyUser == null||("hdfs").equals(proxyUser)){
               throw new RuntimeException(
               "User proxy user, but set the wrong username [" +proxyUser+"]");
          }
          try {
               ugi = ShimLoader.getHadoopShims().createRemoteUser(proxyUser,null);
          } catch (Exception e) {
               throw new RuntimeException(e);
          }
          if (ugi == null) {
               throw new RuntimeException(
               "Can not initialize ProxyUserAuthenticator for user [" +proxyUser+"]");
          }
          this.userName = ShimLoader.getHadoopShims().getShortUserName(ugi);
          if (ugi.getGroupNames() != null) {
               this.groupNames = Arrays.asList(ugi.getGroupNames());
          }
     }else{
          try {
               ugi = ShimLoader.getHadoopShims().getUGIForConf(conf);
          } catch (Exception e) {
               throw new RuntimeException(e);
          }
          if (ugi == null) {
               throw new RuntimeException(
                    "Can not initialize HadoopDefaultAuthenticator.");
          }
          this.userName = ShimLoader.getHadoopShims().getShortUserName(ugi);
          if (ugi.getGroupNames() != null) {
               this.groupNames = Arrays.asList(ugi.getGroupNames());
          }
     }
  }

使用方法:

hive   -hiveconf use.custom.proxy=true -hiveconf  custom.proxy.user=xxx

1)use.custom.proxy 默认值为 false,即使用登录用户做权限验证

2)custom.proxy.user 不能设置为空和 hdfs

测试结果:

hive> show grant user ericni on database default; //用权限的用户
OK
default                         ericni  USER    Select  false   1417681722000   hdfs
hive> show grant user ericni1 on database default; //无权限的用户
OK

有权限的用户 proxy到无权限用户测试, 报没有权限错误:

hive  -i /home/hdfs/.hiverc2 -hiveconf hive.root.logger=WARN,console  
-hiveconf use.custom.proxy=true -hiveconf  custom.proxy.user=ericni1
14/12/05 15:10:35 WARN ExecReducer: in ShimLoader getHadoopShims hadoopShims is class org.apache.hadoop.hive.shims.Hadoop23Shims
Authorization failed:No privilege ‘Select‘ found for inputs { database:default, table:dual}. Use SHOW GRANT to get more details.
14/12/05 15:10:36 ERROR ql.Driver: Authorization failed:No privilege ‘Select‘ found for inputs { database:default, table:dual}. Use SHOW GRANT to get more details.

无权限的用户 proxy到有权限用户测试, 查询正常:

hive> select 1 from default.dual; //没有设置 proxy的时候,没有权限查询
Authorization failed:No privilege ‘Select‘ found for inputs { database:default, table:dual}. Use SHOW GRANT to get more details.
hive -hiveconf use.custom.proxy=true -hiveconf  custom.proxy.user=ericni
//设置代理后,查询正常

仍然存在的问题:

1)Hive向hdfs 写入数据的用户和这个用户是分开的,暂时这块代码还没有动,后面继续跟进

2)代理用户运行任务会有安全的问题,需要加个map,限制用户可以代理的用户

时间: 2024-10-11 11:25:52

hive扩展认证方法的相关文章

【Javascript】jQuery Validate扩展验证方法

/*****************************************************************jQuery Validate扩展验证方法*****************************************************************/// 判断整数value是否等于0 jQuery.validator.addMethod("isIntEqZero", function (value, element) { valu

python3学习之类成员、扩展父类方法的功能

##类成员包括: #字段:静态字段.普通字段    字段也可以理解为"变量" #方法:普通方法.静态方法.类方法:所有方法属于类    方法也可以理解为"函数" #属性:具有方法的定义形式,具有字段访问形式         用字段的访问方式调用方法,就需要定义"属性" #当不想创建对象访问类中方法时,方法需要是静态方法 ##成员修饰符 #公有字段   内外都可以访问 #__name   私有字段,前面有两个下划线,只在类中可以访问,通过对象访问不

子类继承父类后想要扩展父类方法

1 >>> class PClass(object): 2 def setInfo(self,sex='Male'): 3 self.gender = sex 4 5 6 >>> class CClass(PClass): 7 def setInfo(self,who): 8 self.name = who 9 PClass.setInfo(self)#子类继承父类后想要扩展父类方法,若仍想保留父类方法可以通过回调 10 11 12 >>> x = C

jQuery Validate扩展验证方法

/***************************************************************** jQuery Validate扩展验证方法 (linjq) *****************************************************************/ $(function(){ // 判断整数value是否等于0 jQuery.validator.addMethod("isIntEqZero", functio

PHP安装扩展mcrypt以及相关依赖项 【PHP安装PECL扩展的方法】

一:Mcrypt简介 Mcrypt是PHP的一个扩展,完成了常用加密算法的封装.其实该扩展是对mcrypt标准类库的封装,mcrypt完成了相当多的常用加密算法,如DES, TripleDES, Blowfish (default), 3-WAY, SAFER-SK64, SAFER-SK128, TWOFISH, TEA, RC2 和 GOST加密算法,并且提供了CBC.OFB.CFB 和 ECB 四种块加密的模型. 二:安装libmcrypt依赖库 要使用该扩展,必须首先安装mcrypt标准

jquery 扩展插件方法

分析插件jquery.countdown.js 1 (function($) { 2 $.fn.countdown = function(options) { 3 // default options 4 var defaults = { 5 attrName : 'data-diff', 6 tmpl : '<span class="hour">%{h}</span>小时<span class="minute">%{m}<

Python 切片(slice)的扩展使用方法

# -*- coding: utf-8 -*- __author__ = 'xy' #切片(slice)的扩展使用方法 #1 用步长索引来进行扩展的切片操作 # slice[1:2:3]其中第3个位置表示步长,默认为1 #简单的str翻转: s = 'abcde' print s[::-1] # >>>'edcba' #间隔一个字符取值: print s[::2] # >>>'ace' #2 切片索引不越界 print ('a', 'b', 'c')[-100:100]

【转】封装jQuery Validate扩展验证方法

本文转自:http://www.cnblogs.com/linjiqin/p/3433635.html 一.封装自定义验证方法-validate-methods.js /***************************************************************** jQuery Validate扩展验证方法 (linjq) *****************************************************************/ $(

js 判断数组包含某值的方法 和 javascript数组扩展indexOf()方法

var  questionId = []; var anSwerIdValue = []; ////javascript数组扩展indexOf()方法 Array.prototype.indexOf = function (e) { for (var i = 0, j; j = this[i]; i++) { if (j.indexOf(e) != -1) { return i; } } return -1; } if (anSwerIdValue.length < 14) { alert(&quo