LDAP与gitlab:未定义的方法持久化

时间:2014-07-26 15:39:42

标签: gitlab

我目前正在使用LDAP后端设置gitlab服务器。 当我尝试以LDAP数据库中的用户身份登录时,出现以下错误:

"无法通过LDAP授权您,因为:"未定义的方法'持续存在?'对于#"

窥视源代码(特别是app / controllers / omniauth_callbacks_controller.rb)恶棍似乎是:

    @user = Gitlab::LDAP::User.find_or_create(oauth)
    @user.remember_me = true if @user.persisted?

他在这里失败是完全正确的,因为没有方法持续存在? (既不在lib / gitlab / ldap / user.rb也不在lib / gitlab / oauth / user.rb中)。将第二行更改为

    @user.remember_me = false #true if @user.persisted?
由于remember_me是ruby的无效函数,因此

无法正常工作。 我真的不知道ruby,更不用说Ruby On Rails了,所以我不再在这里挖掘了。

由于我当然不是第一个尝试在gitlab中使用LDAP auth的人,我认为这是我的错误。由于身份验证似乎有效(如果我输入用户gitlab的假密码,请高兴地告诉我),我不知道从哪里开始寻找。

我感谢你们的任何帮助,

最佳理查德

编辑:我的gitlab.yml is here

4 个答案:

答案 0 :(得分:1)

自己解决了这个问题。由于用户创建失败,数据库查找产生了一个nil对象(每当ldap用户登录时,gitlab使用ldap数据填充其自己的数据库)。

在创建用户数据库条目期间,查询获得了无效的电子邮件条目,导致插入查询失败。不幸的是,这很难调试。

如果有人遇到此问题,请尝试在lib / gitlab / oauth / user.rb中更改以下代码:

begin
    user.save!
    rescue ActiveRecord::RecordInvalid => e
    raise_error ("(OAuth) Error #{e.to_s}") # <-- add this line
    log.info "(OAuth) Email #{e.record.errors[:email]}. Username #{e.record.errors[:username]}"
    return nil, e.record.errors
end

这将 - 如果gitlab无法添加您的用户 - 在尝试登录时打印数据库后端返回的错误消息作为通常的红色错误横幅。请记住在不再需要时删除此行

答案 1 :(得分:0)

我可以建议一个补丁(在Gitlab 7.1.0上测试)。当ldap用户第一次连接时,此代码将gitlab_rails ['ldap_uid']设置为用户名:

在/opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/oauth/user.rb(参见INCLUDE START和STOP):

      user = model.build_user(opts)
      user.skip_confirmation!

      # Services like twitter and github does not return email via oauth
      # In this case we generate temporary email and force user to fill it later
      if user.email.blank?
        user.generate_tmp_oauth_email
      elsif provider != "ldap"
        # Google oauth returns email but dont return nickname
        # So we use part of email as username for new user
        # For LDAP, username is already set to the user's
        # uid/userid/sAMAccountName.
        email_username = email.match(/^[^@]*/)[0]
        # Strip apostrophes since they are disallowed as part of username
        user.username = email_username.gsub("'", "")
      else
        # INCLUDE START
        # if LDAP config "ldap_uid" is set : we pick this attribute to set the username :
        if ldap_conf['uid'].present?
            user.username = auth.extra.raw_info.send(ldap_conf['uid'])[0]
        end
        # INCLUDE STOP
      end

      begin
        user.save!

答案 2 :(得分:0)

在我的情况下,问题是从旧的gitlab存储库导入(复制文件)到新的。 Gitlab无法为新用户创建干净的文件夹。

解决方案:

  • 删除导入的存储库
  • 首先使用LDAP凭据登录,创建新的空存储库
  • 阅读您的PRIVATE-TOKEN
  • 在您的存储库上启动gitlab服务器即。 &#39; git守护进程--verbose --export-all&#39;
  • 使用API​​从旧gitlab导入数据:

    curl -X POST --header "PRIVATE-TOKEN: xxxxxffxxxyyxxxxzzz" http://testserver07.lq/api/v3/projects"?name=project01&import_url=git://localhost/var/opt/gitlab/git-data/repositories-old/repos/project01.git"
    

答案 3 :(得分:0)

首先,检查Gitlab DB中的电子邮件地址是否正确:

# login to Gitlab DB (MySql)
mysql -u gitlab gitlabhq_production -p

# check user email address
select email from users where username like 'foo';

然后从Gitlab DB中为用户删除存储的LDAP对象:

# clear ldap data
update users set extern_uid = '' where username = 'foo';

下次登录时,Gitlab会写一个新的extern_uid。