sonarqube 5.6 和 LDAP 2.0 无法通过身份验证

sonarqube 5.6 & LDAP 2.0 failing to authenticate

我正在测试对 sonarqube 5.6 的升级并安装了 ldap 2.0 插件并将相关配置复制到我的测试 5.6 设置中。

相关配置为

sonar.security.realm=LDAP
ldap.url=ldaps://xxxx:636
ldap.bindDn=uid=xxxx,ou=xxxx,dc=xxxx,dc=xxxx
ldap.bindPassword=xxxx
ldap.user.baseDn=dc=xxxx,dc=com
ldap.user.request=(&(objectClass=person)(mail={login}))
ldap.user.realNameAttribute=cn
ldap.user.emailAttribute=mail

我在 conf/sonar.properties

中设置了以下内容
sonar.log.level=DEBUG

启动时我看到了

2016.07.26 23:57:29 INFO  web[o.s.p.l.LdapContextFactory] Test LDAP connection on ldaps://xxxx:636: OK
2016.07.26 23:57:29 INFO  web[org.sonar.INFO] Security realm started

如果我尝试登录,我会在登录屏幕上看到 "Authentication failed"。 日志文件只说

2016.07.26 23:57:47 DEBUG web[http] GET / | time=67ms
2016.07.26 23:57:47 DEBUG web[http] GET / | time=187ms
2016.07.26 23:57:47 DEBUG web[http] GET /sessions/new | time=89ms
2016.07.26 23:57:53 DEBUG web[http] POST /sessions/login | time=71ms

相同的配置适用于 sonarqube 4.5.7 和 ldap 1.4

欢迎提供有关如何进一步调查的想法。

您很可能遇到了已知问题 SONAR-7770 - Authentication fails if LDAP configuration has been forgotten during the upgrade . Note that an Upgrade Note 已针对此问题发布:

Most specifically, don't forget to copy the related SonarQube plugin and its related configuration in "conf/sonar.properties" (including "sonar.security.realm" and "sonar.security.localUsers" if present) into the new SonarQube instance otherwise you will be locked out after migration.

因此,即使在 升级期间,此 LDAP 配置仍然存在很重要。如果您确实错过了,那么最简单的方法是在正确设置 LDAP 相关配置的情况下重播升级。

上下文

请记住,在升级过程中,SonarQube 会更新数据集并将新信息存储在数据库中(基于新功能)。您的问题是升级是使用部分配置完成的(未设置 sonar.security.realmsonar.security.localUsers),并且 SonarQube 无法确定用户是否是本地用户,因此默认情况下将它们视为本地。本地用户未通过外部身份验证提供程序进行身份验证,而是在本地进行身份验证,这确实是我们在您的日志中看到的(并且显然失败,因为密码位于 LDAP 服务器中,而不是在 SonarQube 数据库中)。

我通过手动更新 SonarQube 的 users 数据库 table 来修复它,假设所有其他用户都由 LDAP 管理,只有 admin 是本地用户:

UPDATE sonarqube_production.users SET user_local = 0, external_identity_provider = 'ldap' WHERE id != 'admin';

上面对 Schakko 查询的小修正,它应该是 login 而不是 id:

UPDATE users SET user_local = 0, external_identity_provider = 'ldap' WHERE login != 'admin';