Recentemente estive me intrometendo no mesmo problema, mas consegui fazê-lo funcionar. Esta é uma solução muito hacky, então você pode querer refinar você mesmo. Eu faço uso do LDAP para fornecer o endereço de e-mail e as informações da conta do usuário, obtendo o nome do usuário da variável HTTP_REMOTE_USER que é preenchida pelo kerberos via apache.
O seguinte funciona com uma instalação limpa do gitlab com o apache sendo executado como o servidor da web. O omniauth LDAP deve estar ativado e configurado corretamente.
Primeiro, temos que disponibilizar o cabeçalho para o ruby, então, no host virtual (httpd.conf), adicione a linha:RequestHeader set REMOTE-USER %{REMOTE_USER}s
Depois disso, eu modifiquei alguns arquivos para que isso funcionasse, primeiro acima de /home/git/gitlab/vendor/bundle/ruby/2.0.0/gems/gitlab_omniauth-ldap-1.0.3/lib/omniauth/strategies/ldap.rb
Eu modifiquei as linhas 43-49 para ler:
# 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
Substituindo __ldap-user__
e __user-Password__
pelas credenciais de um usuário do gitlab que fiz para o ldap.
Em seguida, precisamos permitir que a função bind_as use um nome de usuário. Eu modifiquei as linhas 86-86 de /home/git/gitlab/vendor/bundle/ruby/2.0.0/gems/gitlab_omniauth-ldap-1.0.3/lib/omniauth-ldap/adaptor.rb
para ler:
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
e, finalmente, modifiquei o diálogo de login do ldap para direcionar a página diretamente para o retorno de chamada excluindo tudo em /home/git/gitlab/app/views/devise/sessions/_new_ldap.html.haml
e adicionando
%script
window.location.href = '/users/auth/ldap/callback'
Espero que isso ajude!
Aviso: se o atributo mail não estiver definido na entrada LDAP do usuário, o script será executado em loop.