Назад | Перейти на главную страницу

аутентификация gitlab с использованием переменной среды HTTP_REMOTE_USER

мы обнаружили gitlab, и я хотел бы интегрировать его в наш глобальный процесс аутентификации, который зависит от переменной среды apache HTTP_REMOTE_USER.

Я видел очень мало документации по нему, поэтому отчаянно ищу любую помощь, как это сделать. Я хотел бы получить из приложения gitlab переменную HTTP_REMOTE_USER и использовать ее для аутентификации моих пользователей.

Я попытался использовать omniauth и omniauth-ldap, но это возвращается только в Ошибках 500 на моем сервере и кажется немного излишним, чтобы получить только переменную Apache HTTP_REMOTE_USER. Я ищу, существует ли такая функция просто или я иду в неправильном направлении; если у кого-то есть ссылки на док!

Большое спасибо


Большое спасибо за ответ! Я уже добавил RequestHeader в файл конфигурации apache (я использую apache как обратный прокси-сервер единорога вместо nginx, и мне нужно перенаправить HTTP_REMOTE_USER единорогу в заголовке apache). Затем я применил доступный патч Вот.

В отличие от вас, я использую не аутентификацию по имени пользователя и паролю ldap, а аутентификацию Kerberos с ldap для авторизации. Когда я перехожу на веб-страницу gitlab, я вижу в журналах, что моя аутентификация предоставлена, и gitlab извлекает из ldap мои атрибуты пользователя (адрес электронной почты). Он даже создает мою учетную запись (согласно allow_single_sign_on: true в файле /home/git/gitlab/config/gitlab.yml). Но затем он отображает ошибку 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 (немного). : / Любая помощь будет оценена здесь!

Недавно я столкнулся с той же проблемой, но мне удалось заставить ее работать. Это очень хакерское решение, поэтому вы можете улучшить его самостоятельно. Я использую LDAP для предоставления адреса электронной почты и информации об учетной записи пользователя, получая имя пользователя из переменной HTTP_REMOTE_USER, которая заполняется kerberos через apache.

Следующее работает с чистой установкой gitlab с apache, работающим в качестве веб-сервера. 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-user__ и __user-Password__ с учетными данными пользователя gitlab, который я сделал для ldap.

Затем нам нужно разрешить функции 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

и, наконец, я изменил диалог входа в систему ldap, чтобы направить страницу прямо к обратному вызову, удалив все в /home/git/gitlab/app/views/devise/sessions/_new_ldap.html.haml и добавление

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

Надеюсь, это поможет!

Предупреждение: если атрибут mail не установлен в записи LDAP пользователя, сценарий зациклится.