我们已经发现了 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 条目中未设置邮件属性,则脚本将循环。