使用gitlab的LDAP:未定义的方法已保留

使用gitlab的LDAP:未定义的方法已保留,gitlab,Gitlab,我目前正在使用LDAP后端设置gitlab服务器。 当我尝试以LDAP数据库中的用户身份登录时,会出现以下错误: 无法从LDAP授权您,因为#的“未定义方法”为“持久化” 窥视源代码(特别是app/controllers/omniauth\u callbacks\u controller.rb),反派似乎是: @user = Gitlab::LDAP::User.find_or_create(oauth) @user.remember_me = true if @user.per

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

无法从LDAP授权您,因为#的“未定义方法”为“持久化”

窥视源代码(特别是app/controllers/omniauth\u callbacks\u 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?
也不起作用,因为Remembere_me对于ruby是无效函数。 我真的对ruby一无所知,更不用说RubyonRails了,所以我不再在这里挖掘了

因为我不是第一个尝试在GITLAB中使用LDAP AUTH的人,所以我认为这是错误的。因为认证似乎起作用(如果我输入了一个错误的密码给GITLB用户高兴地告诉我),我不知道从哪里开始查找。

我感谢你们的帮助

最佳理查德


编辑:My gitlab.yml。

我自己解决了这个问题。由于用户创建失败,数据库查找产生了一个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
开始
user.save!
rescue ActiveRecord::RecordInvalid=>e
raise_error(“(OAuth)error#{e.to_s}”)#我可以建议一个补丁(在Gitlab 7.1.0上测试)。当ldap用户第一次连接时,此代码将Gitlab_rails['ldap_uid'设置为用户名:

在/opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/oauth/user.rb中(请参阅包含启动和停止):


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

解决方案:

  • 删除导入的存储库
  • 通过使用LDAP凭据首次登录来创建新的空存储库
  • 阅读你的私人代币
  • 在存储库上启动gitlab服务器,即“git守护进程--verbose--export all”
  • 使用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"
    

首先,检查您在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时,编写一个新的外部uid

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