hive认证相关类分析

目前的hive版本是支持authentication和authorization的(再加上计费就是3A了,哈哈),

在hive的java.org.apache.hadoop.hive.conf.HiveConf类中定义的权限相关的设置项有:

HIVE_AUTHORIZATION_ENABLED("hive.security.authorization.enabled", false),   //是否开启权限验证
HIVE_AUTHORIZATION_MANAGER("hive.security.authorization.manager", 
    "org.apache.hadoop.hive.ql.security.authorization.DefaultHiveAuthorizationProvider"),  //默认的授权实现类
HIVE_AUTHENTICATOR_MANAGER("hive.security.authenticator.manager",  // 默认的认证实现类
    "org.apache.hadoop.hive.ql.security.HadoopDefaultAuthenticator"),
HIVE_METASTORE_AUTHORIZATION_MANAGER("hive.security.metastore.authorization.manager", //metasotre服务的权限验证
    "org.apache.hadoop.hive.ql.security.authorization."
    + "DefaultHiveMetastoreAuthorizationProvider"),
HIVE_METASTORE_AUTHENTICATOR_MANAGER("hive.security.metastore.authenticator.manager",
    "org.apache.hadoop.hive.ql.security.HadoopDefaultMetastoreAuthenticator"),
HIVE_AUTHORIZATION_TABLE_USER_GRANTS("hive.security.authorization.createtable.user.grants", ""),  //下面4项会对创建表的权限的定义,这里有个bug,之前已经fix
HIVE_AUTHORIZATION_TABLE_GROUP_GRANTS("hive.security.authorization.createtable.group.grants",
    ""),
HIVE_AUTHORIZATION_TABLE_ROLE_GRANTS("hive.security.authorization.createtable.role.grants", ""),
HIVE_AUTHORIZATION_TABLE_OWNER_GRANTS("hive.security.authorization.createtable.owner.grants",
    ""),

authenticator相关代码在org.apache.hadoop.hive.ql.security包

简单说明如下

1.HiveAuthenticationProvider 是一个扩展了Configurable的接口,实现类主要需要实现getUserName和getUserName方法

2.SessionStateConfigUserAuthenticator 实现了HiveAuthenticationProvider接口,用来做测试和debug的,主要是getUserName方法:

  public String getUserName() {
    String newUserName = sessionState.getConf().get("user.name" , "" ).trim();  // 是根据user.name的设置获取user
    if (newUserName.isEmpty()) {
      return System. getProperty("user.name");  // 如果为空,根据System.getProperty( "user.name")设置user, 可以获取通过-D<name>=<value>设置,没有设置时为当前登录用户
    } else {
      return newUserName;
    }
  }

3.SessionStateUserAuthenticator实现了HiveAuthenticationProvider接口,是hiveserver2 用来做验证的类

4.ProxyUserAuthenticator 扩展了HadoopDefaultAuthenticator ,重写了setConf方法,主要调用了UserGroupInformation类的createRemoteUser方法,可以做代理用户类(根据proxy.user.name的设置获取username)

5.因为默认hive.security.authenticator.manager的设置时org.apache.hadoop.hive.ql.security.HadoopDefaultAuthenticator,因此我们主要看的还是在HadoopDefaultAuthenticator类中,主要的方法时setConf方法

  public void setConf(Configuration conf) {  
    this. conf = conf;
    UserGroupInformation ugi = null;
    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用来做认证的用户是在第一个命令运行时进行初始化的(后面即使通过设置也不会生效)因为在hive cli启动时,会读取.hiverc文件运行CREATE TEMPORARY FUNCTION xxxx,在第一个create xxx运行时,在命令的compile阶段(即Driver.compile()方法):

if (HiveConf.getBoolVar(conf,
     HiveConf.ConfVars.HIVE_AUTHORIZATION_ENABLED)) {  // 判断hive.security.authorization.enabled是否设置为true
   try {
     perfLogger.PerfLogBegin(CLASS_NAME, PerfLogger.DO_AUTHORIZATION);
     doAuthorization(sem);  // 如果开启了验证,则调用doAuthorization方法
   } catch (AuthorizationException authExp) {
     console.printError("Authorization failed:" + authExp.getMessage()
         + ". Use SHOW GRANT to get more details.");
     errorMessage = authExp.getMessage();
     SQLState = "42000";
     return 403;
   } finally {
     perfLogger.PerfLogEnd(CLASS_NAME, PerfLogger.DO_AUTHORIZATION);
   }
}

doAuthorization方法

private void doAuthorization(BaseSemanticAnalyzer sem)
  throws HiveException, AuthorizationException {
  HashSet<ReadEntity> inputs = sem.getInputs();
  HashSet<WriteEntity> outputs = sem.getOutputs();
  SessionState ss = SessionState.get();
  HiveOperation op = ss.getHiveOperation();  // 判断操作类型
  Hive db = sem.getDb();
  if (ss.isAuthorizationModeV2()) {  // 如果为v2时,调用doAuthorizationV2方法,而SessionState.isAuthorizationModeV2方法调用了SessiontState.getAuthorizationMode方法
    doAuthorizationV2(ss, op, inputs, outputs);
    return;
  }
  if (op == null) { 
    throw new HiveException("Operation should not be null");
  }
  if (op.equals(HiveOperation.CREATEDATABASE)) {   //下面的代码是做具体的验证操作,涉及到authorizator类
      ss.getAuthorizer().authorize(
...

SessionState.isAuthorizationModeV2和SessiontState.getAuthorizationMode方法:

  public AuthorizationMode getAuthorizationMode(){  //判断Authorization的类型(v1 or v2)
    setupAuth(); //调用SessiontState.setupAuth方法
    if(authorizer != null){
      return AuthorizationMode. V1;
    }else if(authorizerV2 != null){
      return AuthorizationMode. V2;
    }
    //should not happen - this should not get called before this.start() is called
    throw new AssertionError("Authorization plugins not initialized!" );
  }
  public boolean isAuthorizationModeV2(){
    return getAuthorizationMode() == AuthorizationMode. V2;
  }

SessiontState的setupAuth方法:

private void setupAuth() {
  if (authenticator != null) {  // 如果已经初始化过就直接返回,这里导致后面即使手动设置用户也不会生效
    // auth has been initialized
    return;
  }
  try {
    authenticator = HiveUtils.getAuthenticator(conf,
        HiveConf.ConfVars.HIVE_AUTHENTICATOR_MANAGER);// 调用HiveUtils.getAuthenticator方法生成一个对应类的实例
    authenticator.setSessionState(this);
    authorizer = HiveUtils.getAuthorizeProviderManager(conf,
        HiveConf.ConfVars.HIVE_AUTHORIZATION_MANAGER, authenticator, true);

.....

HiveUtils的getAuthenticator方法是用ReflectionUtils.newInstance生成org.apache.hadoop.hive.ql.security.HadoopDefaultAuthenticator类的实例,然后调用实例的setConf方法,设置hive的用户和组信息.

整个的调用顺序:

Driver.compile--->Driver.doAuthorization--->SessionState.isAuthorizationModeV2---->
SessiontState.getAuthorizationMode--->SessionState.setupAuth
--->HiveUtils.getAuthenticator+HiveUtils--->HadoopDefaultAuthenticator.setConf

需要注意的是:
1)这个账号控制的是hive的权限,和hdfs的权限无关,这两个需要区别开
2)在第一个命令的时候初始化,后面不再初始化
3)具体的验证操作是由HiveAuthorizationProvider的具体实现类的authorize完成

时间: 2024-10-07 03:51:56

hive认证相关类分析的相关文章

aspnetcore 认证相关类简要说明二

能过<aspnetcore 认证相关类简要说明一>我们已经了解如何将AuthenticationOptions注入到我们依赖注入系统.接下来,我们将了解一下IAuthenticationSchemeProvider通过AuthenticationOptions如何提供AuthenticationScheme的.aspnetcore 中IAuthenticationSchemeProvider默认实现是AuthenticationSchemeProvider,我们简单的分析下它的源码(以下是我简

Cordova Android源码分析系列二(CordovaWebView相关类分析)

本篇文章是Cordova Android源码分析系列文章的第二篇,主要分析CordovaWebView和CordovaWebViewClient类,通过分析代码可以知道Web网页加载的过程,错误出来,多线程处理等. CordovaWebView类分析 CordovaWebView类继承了Android WebView类,这是一个很自然的实现,共1000多行代码.包含了PluginManager pluginManager,BroadcastReceiver receiver,CordovaInt

hive的shims相关类分析

在hive的源码中经常可以看到shims相关的类,shims相关类是用来兼容不同的hadoop和hive版本的,以HadoopShims为例org.apache.hadoop.hive.shims.HadoopShims是一个接口,具体的实现类为 org.apache.hadoop.hive.shims.Hadoop20Shims org.apache.hadoop.hive.shims.Hadoop20SShims org.apache.hadoop.hive.shims.Hadoop23Sh

aspnetcore 认证相关类简要说明三

今天我们再来了解一个很重要的接口IAuthenticationService的实现类AuthenticationService: public class AuthenticationService : IAuthenticationService { public AuthenticationService(IAuthenticationSchemeProvider schemes, IAuthenticationHandlerProvider handlers, IClaimsTransfo

hive执行流程(3)-Driver类分析1Driver类整体流程

Driver类是对 org.apache.hadoop.hive.ql.processors.CommandProcessor.java 接口的实现,重写了run方法,定义了常见sql的执行方式. public class Driver implements CommandProcessor 具体的方法调用顺序: run--->runInternal--->(createTxnManager+recordValidTxns)----->compileInternal---> com

List 接口以及实现类和相关类源码分析

List 接口以及实现类和相关类源码分析 List接口分析 接口描述 用户可以对列表进行随机的读取(get),插入(add),删除(remove),修改(set),也可批量增加(addAll),删除(removeAll,retainAll),获取(subList). 还有一些判定操作:包含(contains[All]),相等(equals),索引(indexOf,lastIndexOf),大小(size). 还有获取元素类型数组的操作:toArray() 注意事项 两种迭代器Iterator和L

keystone 认证深度研究分析

一.Keystone Token深度概述 Keystone作为OpenStack项目基础认证模块,目前支持的token类型分别是uuid.pkiz.pki.fernet. 首先,简要叙述一下这四种类型的原理及其优缺点. uuid 比较简单,采用随机生成的序列(128位,以16进制表示)作为id,并构造token内容,需要持久化后端数据库支撑,比如MySQL数据库存储.优点,实现简单:缺点是持久化查询.每次访问都需要keystone相关服务进行认证. pki(pkiz) 基于cms算法,token

[转帖]我最近研究了hive的相关技术,有点心得,这里和大家分享下。

我最近研究了hive的相关技术,有点心得,这里和大家分享下. https://www.cnblogs.com/sharpxiajun/archive/2013/06/02/3114180.html 首先我们要知道hive到底是做什么的.下面这几段文字很好的描述了hive的特性: 1.hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行.其优点是学习成本低,可以通过类SQL语句快速实

MFC的窗口分割的设计与实现以及CSplitterWnd 类分析

1 引言 在Microsoft VC++ 6.0 中,基于MFC 的应用程序一般分为以下几种:多文档界面(MDI). 单文档界面(SDI)以及基于对话框的应用程序.其中单文档又可分为单视图的和多视图的, 一般情况下,单文档仅需要单视图就够了,如Windows 自带的记事本.画图程序等等,但 在一些情况下,单文档需要多视图支持,比如同时观察文档的不同部分,同时从不同的角度 观察同一文档等. 在MFC 的框架下,文档对象(CDocument)有一个保存其所有视图的列表,并提供了 增加视图(AddVi