场景:比如在hue里面通过向需要认证的livy提交spark任务,希望认证用户和代理用户分开

条件:假设livy已经开启认证功能,比如自定用户名密码的认证 https://www.cnblogs.com/aichihuluobo/p/17272688.html

1 Livy打开impersonate功能,并指定可以具有imperson功能的用户

livy.impersonation.enabled       true
livy.superusers hadoop

这里我们使用hadoop作为可以代理的用户,其他的用户必须认证用户和代理用户一致;

 

源码分析

AccessManager.scala 

  def checkImpersonation(
      target: Option[String],
      requestUser: String): Option[String] = {
    if (conf.getBoolean(LivyConf.IMPERSONATION_ENABLED)) {
      if (!target.forall(hasSuperAccess(_, requestUser))) {
        throw new AccessControlException(
          s"User '$requestUser' not allowed to impersonate '$target'.")
      }
      target.orElse(Option(requestUser))
    } else {
      None
    }
  }

 

2 HUE传入认证信息

sudo vi /usr/lib/hue/apps/spark/src/spark/livy_client.py

if self.csrf_enabled:
      self._client.set_headers({'X-Requested-By': 'hue'})

修改成

if self.csrf_enabled:
      self._client.set_headers({'X-Requested-By': 'hue','Authorization':'Basic abdacsdsf'})
 

其中abdacsdsf是经过base64加密后你认证的用户名和密码,比如hadoop;

重启hue服务;

posted on 2023-07-19 14:35  我爱吃胡萝卜  阅读(95)  评论(0)    收藏  举报