[メモ]Gitlab手術室:LDAPが配置されているのにずっとInvalid Credentialの解決

4983 ワード

先日Gitlab serverで遊んで、他の人に共有するときは直接会社LDAPで認証してログインしたいと思っていました.その後、GitlabはLDAPのsuperuserを提供する必要があります.ログインするたびにsuperuserでfilterクエリーを使用して検証します.私はsuperuserを持っていません.どうすればいいですか?
だから「自分で手を出して、豊衣足食」.
説明はGithubに置いて、興味があれば試してみてください.
まずgitlabのデバッグですが、簡単にするためにGitlab公式のdockerミラーを直接使用しました.docker run gitlabGitlabができるようになった.以下はLDAPモジュールを手術改造し、まずdocker exec -it gitlab-container-id /bin/bashGitlab容器に入ってからにしよう.
最初は公式サイトに従ってLDAPを配置して、物を配置して、それからenable、それからgitlab-ctl reconfigure、ページを更新して、喜んでログイン画面にLDAP tabがあるのを見ました.ユーザー名とパスワードを入力すると、不思議なことに500エラーが続いています.
Debug Gitlabの検索を開始します.Stackoverflowをクリックすると、初めて結果が出ませんが、infoレベルからdebugレベルにlogを設定する方法が見つかりました.vi $(find /opt/gitlab/embedded/service/gitlab-rails -name production.rb) .gitlab-ctl restart後、LDAP登録500のエラーが消えてしまった.Gitlabにはバグがあるに違いない.無視する.
しばらく使ってgitlab-ctl、helpで見つけたgitlab-ctl taillogの変化を検出できます.やりやすいです.bashを2つ、tail専用を1つ、コードを変更します.500エラーがなくなってから、ずっとInvalid credentialsのエラーを報告しています.grepはどこにいますか:gems/gitlab_omniauth-ldap-1.2.1/lib/omniauth/strategies/ldap.rb.Gitlabの変なところを発見しました.LDAPにログインするたびに、まず構成のユーザーでログインしたユーザー情報を検索してbindで検証します.ちょっと複雑です.
@ldap_user_info = @adaptor.bind_as(:filter => filter(@adaptor), :size => 1, :password => request[‘password’])
順藤摸瓜、@adaptor.bind_as、うーん、少なくとも関数名があって、grep後発見gems/gitlab_omniauth-ldap-1.2.1/lib/omniauth-ldap/adaptor.rb.最初はruby-net-ldapライブラリのバージョンが低すぎると思っていたのでexport GEM_HOME修正Gemfile.lock、installは0.15.0を元の0.12.1に置き換え、卵を並べた.それはbind_asやめて書き直すしかない.
  def bind_as(args={})
    result = {}
    result[:uid] = ["#{args[:username]}"]
    result[:email] = ["#{args[:username]}@example.com"]
    login = "#{args[:username]}@example.com"
    password = args[:password]
    config = {
      :host => @host,
      :port => @port,
      :encryption => method,
      :base => @base
      :auth => {}
    }
    config[:auth][:method] = @bind_method
    config[:auth][:username] = login
    config[:auth][:password] = password
    @connection = Net::LDAP.new(config)
    false
    result if @connection.bind
  end

Gitlabを再起動し、LDAPログイン--エラー:nilにproviderがありません.何の見当もつかない.たまたまtailのロゴにemail is invalid、grepを発見!見つかったgitlab-rails/lib/gitlab/o_auth/user.rb.上のコードは最初result[:email] = ["#{args[:username]}@example.com"]配列ではなくlog.info毎回のemail発見がusernameの最初の文字であることを出力した.変更してもログインできません.userはsaveの時ずっと間違っていました.gitlab-rails/lib/gitlab/ldap/user.rb里発見相続o_authのクラス、gl_user取得時にあったfind_by_uid_and_provider、あとはfind_by_email、だったらfind_by_uid_and_providerを削除しましょう.
大喜びして、ついにpassは登録のすべてのステップをしました.私はまずLDAP以外のユーザーを登録しましたが、ユーザー名もメールボックスも自分のものを使っているので、find_by_emailこの登録したユーザーが見つかるはずです.やはり私が予想したように、ログインユーザー名のパスワードの入力が正しいのか、ログインしていないのか、ユーザーがblockされていることを示しています.私のLDAPはすでに会社に閉鎖されています.私はjsスクリプトT_を書いていません.T.
rootユーザーでログインすると、登録したアカウントがblockされていてLDAP側の情報でしたが、会社の他のappも通常通り使用できます.Gitlabにチェックがあるんだよ.grep block、メインのファイルを見つけたgitlab-rails/lib/gitlab/ldap/access.rb、中のallowedを直接return trueと判断すればよかった.興味のある子供靴なら、コードを書いてLDAP serverに接続し、eeというkeyのようなvalueをsearchで検索してtrueやfalseに戻ることができます.ここは簡単で乱暴です.
再起動、ログイン、完了!お茶でも飲めるかと思いきや、git clonegit pushまた掛けました.エラーメッセージgrepからフローを見つける:gitlab-rails/app/controllers/projects/git_http_controller.rb=>gitlab-rails/lib/gitlab/auth.rb=>gitlab-rails/lib/gitlab/ldap/authentication.rb.filterの残党を発見し、username直接伝に変更した.find_by_uid_and_providerに変更find_by_email.再起動、ログイン、プロジェクトの作成、clone、push.
Gitlabはこれで手術を終えた.