SonarQube LDAP身份验证似乎加载但不允许通过域用户登录

cav*_*ick 11 ldap active-directory sonarqube

我一直在尝试使用LDAP身份验证插件(v1.4)设置SonarQube(v4.1),我无法让它对我的域用户进行身份验证.我的配置设置如下:

#########################
# LDAP configuration
#########################
# General Configuration
sonar.security.realm=LDAP
sonar.security.savePassword=true
sonar.security.updateUserAttributes=true
sonar.authenticator.downcase=true
sonar.authenticator.createUsers=true

ldap.authentication=simple
ldap.realm=mydomain.co.uk
ldap.bindDn=CN=USERNAME,OU=developers,DC=mydomain,DC=co,DC=uk
ldap.bindPassword=PASSWORD

# User Configuration
#ldap.user.baseDn=OU=developers,DC=mydomain,DC=co,DC=uk
ldap.user.request=(&(objectClass=user)(sAMAccountName={login}))
ldap.user.realNameAttribute=cn
ldap.user.emailAttribute=mail

# Group Configuration
ldap.group.baseDn=CN=Domain Users,CN=Users,DC=adastra,DC=co,DC=uk
ldap.group.request=(&(objectClass=group)(member={dn}))
Run Code Online (Sandbox Code Playgroud)

并且日志输出以下似乎说LDAP连接正常工作的消息:

2014.01.20 16:12:32 INFO  [org.sonar.INFO]  Security realm: LDAP
2014.01.20 16:12:32 INFO  [o.s.p.l.LdapSettingsManager]  Auto discovery mode
2014.01.20 16:12:32 INFO  [o.s.p.l.LdapSettingsManager]  Detected server: ldap://dc02.mydomain.co.uk:389
2014.01.20 16:12:32 INFO  [o.s.p.l.LdapSettingsManager]  User mapping: LdapUserMapping{baseDn=dc=mydomain,dc=co,dc=uk, request=(&(objectClass=user)(sAMAccountName={0})), realNameAttribute=cn, emailAttribute=mail}
2014.01.20 16:12:32 INFO  [o.s.p.l.LdapSettingsManager]  Group mapping: LdapGroupMapping{baseDn=CN=Domain Users,CN=Users,DC=mydomain,DC=co,DC=uk, idAttribute=cn, requiredUserAttributes=[dn], request=(&(objectClass=group)(member={0}))}
2014.01.20 16:12:32 INFO  [o.s.p.l.LdapContextFactory]  Test LDAP connection on ldap://dc02.mydomain.co.uk:389: OK
2014.01.20 16:12:32 INFO  [org.sonar.INFO]  Security realm started
Run Code Online (Sandbox Code Playgroud)

但它似乎对我的用户不起作用,除非我使用本地用户.通过设置启用包装器的登录时:

wrapper.console.loglevel=DEBUG
Run Code Online (Sandbox Code Playgroud)

我在日志中得到以下错误,这实际上没有多大帮助!:)

2014.01.20 17:07:10 ERROR [rails]  Error from external users provider: 
Run Code Online (Sandbox Code Playgroud)

kev*_*npo 15

我刚刚开始使用SonarQube LDAP插件自己使用Active Directory.由于每个人的网络设置不同,您通常无法复制和粘贴配置.这是我用来确定公司正确配置的过程:

文档中所述,此配置在文件中:

SONARQUBE_HOME/conf目录/ sonar.properties

按原样需要以下行:sonar.security.realm=LDAP.其他线路将因公司而异.

使用GUI工具测试配置对我很有帮助.我使用了Softerra LDAP Browser(LDAP管理员的免费只读版本).在那个LDAP浏览器中,

  1. 创建新的个人资料.
  2. 查找服务器按钮将帮助确定ldap.url.你将需要最终得到的东西ldap.url=ldap://dc01.mycompany.local:3268.注意:如另一个答案所述,这可能需要与此屏幕中列出的端口不同.
  3. Base DN框现在可以留空.
  4. 对于身份验证,我只选择了当前登录的用户.
  5. 过滤器现在也可以留空.
  6. 单击"完成",它应显示AD顶层的项目.
  7. F3切换快速搜索栏.
  8. 由于您无法使用匿名身份验证将SonarQube连接到AD,因此您需要选择SonarQube服务的用户进行连接.在快速搜索中搜索该用户.
  9. 您应该找到CN(公用名)条目.双击它以打开它.
  10. 找到distinguishedName字段并复制其值以用作您的 ldap.bindDn
  11. ldap.bindPassword 应该是该用户的密码.
  12. 这应该足以让SonarQube成功启动,但这还不足以让它搜索试图登录SonarQube门户网站的用户.为此,首先选择一个样本人(比如你自己).
  13. 对示例人员执行另一个快速搜索并打开其CN条目
  14. 获取其distinguishedName的值,删除"CN = {他们的名字}",然后将其放入 ldap.user.baseDn
  15. 你需要确定的最后一块ldap.user.request.SonarQube文档中与AD一起使用的建议对我有用:(&(objectClass=user)(sAMAccountName={login})).让我解释一下为什么,如果它不适合你."{login}"将被SonarQube为其用户名输入的内容所取代,因此请求字符串(在LDAP浏览器中称为"过滤器")实际上是要搜索任何objectClass等于"user"的所有条目,他们的sAMAccountName等于您在SonarQube门户网站中输入的用户名文本框中输入的内容.在示例人员的信息中,应该至少有一个名为"objectClass"的字段.其中一个应该具有值"user".sAMAccountName也应该有一个字段.将该值用于SonarQube Web门户中的用户名文本框.
  16. 要测试该请求字符串是否适合您,请在LDAP浏览器中执行目录搜索(Ctrl + F3).将您的ldap.user.baseDn值放在"搜索DN"文本框中,并将您的ldap.user.request值放入Filter文本框中(确保用您的示例用户名手动替换"{login}").它应该返回样本人的CN条目.


cav*_*ick 9

感谢@aaron,他设法指出了我正确的方向!对于我的问题,这是自动发现和我连接的森林的问题.根据http://technet.microsoft.com/en-us/library/cc978012.aspx,您应该在连接到林时使用不同的端口,以便它可以搜索整个林而不是您正在连接的域(我认为在自动发现模式下可能不是正确的).最后,对我有用的配置是:

# General Configuration
ldap.realm=mydomain.com
sonar.security.realm=LDAP
sonar.authenticator.createUsers=true
sonar.security.savePassword=true
sonar.security.updateUserAttributes=true
ldap.url=ldap://dc.mydomain.com:3268 

# User Configuration
ldap.user.request=(&(objectClass=user)(sAMAccountName={login}))
ldap.user.realNameAttribute=cn
ldap.user.emailAttribute=mail
Run Code Online (Sandbox Code Playgroud)

这实际上非常简单,不需要用户帐户连接.这意味着它处于SIMPLE身份验证模式(我似乎无法让它在其他任何方面工作),但这对我很好,因为它是一个内部唯一的系统.