使用 HTTP_REMOTE_USER 环境变量进行 gitlab 身份验证

使用 HTTP_REMOTE_USER 环境变量进行 gitlab 身份验证

我们已经发现了 gitlab,我想将其集成到我们的全局身份验证流程中,该流程依赖于 apache HTTP_REMOTE_USER 环境变量。

我看过的关于它的文档很少,所以我迫切地寻求有关如何做到这一点的帮助。我想从 gitlab 应用程序中检索 HTTP_REMOTE_USER 变量并使用它来验证我的用户。

我曾尝试使用 omniauth 和 omniauth-ldap,但这只会在我的服务器中返回 500 错误,而且似乎有点过度,无法仅检索 Apache HTTP_REMOTE_USER 变量。我正在寻找的是,这样的功能是否存在,或者我是否走错了方向;如果有人有关于它的文档链接!

非常感谢


非常感谢您的回答!我已经在 apache 配置文件中添加了 RequestHeader(我使用 apache 作为 unicorn 反向代理而不是 nginx,并且需要在 apache 标头中将 HTTP_REMOTE_USER 转发到 unicorn)。然后,我应用了可用的补丁这里

与您不同,我没有使用 ldap 用户名/密码身份验证,而是使用 ldap 进行 Kerberos 身份验证进行授权。当我进入 gitlab 网页时,我可以在日志中看到我的身份验证已获批准,并且 gitlab 从 ldap 检索我的用户属性(电子邮件地址)。它甚至创建了我的帐户(根据 /home/git/gitlab/config/gitlab.yml 文件中的 allow_single_sign_on: true)。但随后,它显示错误 500,日志消息为“错误堆栈太深”。

然后我将文件 vendor/bundle/ruby/2.0.0/activesupport-3.2.13/lib/active_support/callbacks.rb 更改为放在虚拟文件上,发生了什么:(第 413 行)

def __reset_runner(symbol)
  f = File::open('/tmp/blah', 'a')
  f.write(caller(1,10))
  f.close()

然后我看到它在一些函数上递归(在无限循环中互相调用的函数)。(这是 /home/git/gitlab 中的句点;第一行在最后一行之后重复):

vendor/bundle/ruby/2.0.0/gems/activesupport-3.2.13/lib/active_support/callbacks.rb:436:in `block in __update_callbacks'
vendor/bundle/ruby/2.0.0/gems/activesupport-3.2.13/lib/active_support/callbacks.rb:433:in `each'
vendor/bundle/ruby/2.0.0/gems/activesupport-3.2.13/lib/active_support/callbacks.rb:433:in `__update_callbacks'
vendor/bundle/ruby/2.0.0/gems/activesupport-3.2.13/lib/active_support/callbacks.rb:502:in `set_callback'
vendor/bundle/ruby/2.0.0/gems/activemodel-3.2.13/lib/active_model/callbacks.rb:110:in `before_save'
vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/autosave_association.rb:189:in `add_autosave_association_callbacks'
vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/autosave_association.rb:140:in `build'
vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations/builder/has_many.rb:10:in `build'
vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations/builder/collection_association.rb:13:in `build'
vendor/bundle/ruby/2.0.0/gems/activerecord-3.2.13/lib/active_record/associations.rb:1198:in `has_many'

在这一步,我真的不知道如何解决这个问题;这远远超出了我的 RoR(无)和 Ruby(少量)知识。:/ 如能得到任何帮助我将不胜感激!

答案1

我最近一直在努力解决同样的问题,但我设法让它工作了。这是一个非常棘手的解决方案,所以你可能想自己改进它。我利用 LDAP 提供电子邮件地址和用户帐户信息,从 HTTP_REMOTE_USER 变量中获取用户名,该变量由 kerberos 通过 apache 填充。

以下步骤适用于全新安装的 gitlab,其中 apache 作为 Web 服务器运行。应启用并正确配置 LDAP omniauth。

首先,我们必须使标头可供 ruby​​ 使用,因此在虚拟主机(httpd.conf)中添加以下行:

RequestHeader set REMOTE-USER %{REMOTE_USER}s

之后,我修改了一些文件,使其工作,首先/home/git/gitlab/vendor/bundle/ruby/2.0.0/gems/gitlab_omniauth-ldap-1.0.3/lib/omniauth/strategies/ldap.rb

我修改了第 43 至 49 行,内容如下:

# Dont allow blank password for ldap auth
      #if request['username'].nil? || request['username'].empty? || request['password'].nil? || request['password'].empty?
      #  raise MissingCredentialsError.new(env.to_a)#"Missing login credentials")
      #end

      @ldap_user_info = @adaptor.bind_as(:filter => Net::LDAP::Filter.eq(@adaptor.uid, @options[:name_proc].call(request.env['HTTP_REMOTE_USER'].split('@')[0])),:size => 1, :username => "__ldap-user__", :password => "__User-Password__")
      return fail!(:invalid_credentials) if !@ldap_user_info

用我为 ldap 创建的 gitlab 用户的凭证替换__ldap-user__和。__user-Password__

然后我们需要允许 bind_as 函数接受用户名。我修改了第 86-86 行,如下/home/git/gitlab/vendor/bundle/ruby/2.0.0/gems/gitlab_omniauth-ldap-1.0.3/lib/omniauth-ldap/adaptor.rb所示:

  def bind_as(args = {})
    result = false
    @connection.open do |me|
      rs = me.search args
      if rs and rs.first and dn = rs.first.dn
        password = args[:password]
        username = args[:username]
        method = args[:method] || @method
        password = password.call if password.respond_to?(:call)
        if method == 'sasl'
        result = rs.first if me.bind(sasl_auths({:username => username, :password => password}).first)
        else
        result = rs.first if me.bind(:method => :simple, :username => username,
                            :password => password)
        end
      end
    end
    result
  end

/home/git/gitlab/app/views/devise/sessions/_new_ldap.html.haml最后,我修改了 ldap 登录对话框,删除了所有内容并添加了以下内容,将页面直接引导至回调

%script
  window.location.href = '/users/auth/ldap/callback'

我希望这有帮助!

警告:如果用户的 LDAP 条目中未设置邮件属性,则脚本将循环。

相关内容