项目

常规

个人资料

操作

LDAP身份验证

Redmine原生支持使用一个或多个LDAP目录进行LDAP身份验证。

声明LDAP

前往管理,然后在菜单中单击“LDAP身份验证”。

输入以下内容

  • 名称:目录的任意名称
  • 主机:LDAP主机名
  • 端口:LDAP端口(默认为389)
  • LDAPS:如果您想或需要使用LDAPS访问目录,请勾选此选项
  • 账户:输入一个具有读取访问权限的LDAP的用户名,如果您的LDAP可以匿名读取(Active Directory服务器通常不允许匿名访问),则留空此字段
  • 密码:账户密码
  • 基本DN:您的LDAP目录树的最顶层DN
  • 登录属性:输入将用作Redmine用户名的LDAP属性名称

现在,如果Redmine用户将账户设置为使用LDAP进行身份验证,则应能够使用其LDAP用户名和密码进行身份验证。

要测试此功能,请创建一个与LDAP账户登录名匹配的Redmine用户(通常,Redmine将通过查找LDAP数据来通知您),在“身份验证模式”下拉列表中选中新创建的LDAP(此字段仅在声明了LDAP的情况下在账户屏幕上可见)并留空其密码。尝试使用LDAP用户名和密码登录Redmine。

动态用户创建

通过勾选“动态用户创建”,任何LDAP用户在第一次登录Redmine时都会自动创建其Redmine账户。
为此,您必须指定用于创建Redmine账户的LDAP属性名称(名,姓,电子邮件)。

以下是一个使用Active Directory的典型示例

Name     = My Directory
Host     = host.domain.org
Port     = 389
LDAPS    = no
Account  = MyDomain\UserName (or UserName@MyDomain depending on AD server)
Password = <password>
Base DN  = CN=users,DC=host,DC=domain,DC=org

On-the-fly user creation = yes
Attributes
  Login     = sAMAccountName
  Firstname = givenName
  Lastname  = sN
  Email     = mail

以下是一个用于具有部门化内部网络的Active Directory的另一个示例

Name     = Just a description for the auth modes page
Host     = DepartmentName.OrganizationName.local
Port     = 389
LDAPS    = no
Account  = DepartmentName\UserName (or UserName@MyDomain depending on AD server or bind DN uid=Manager,cn=users,dc=MyDomain,dc=com)
Password = <password>
Base DN  = DC=DepartmentName,DC=OrganizationName,DC=local

On-the-fly user creation = yes
Attributes
  Login     = sAMAccountName
  Firstname = givenName
  Lastname  = sN
  Email     = mail

请注意,LDAP属性名称是区分大小写的

动态绑定账户

以上配置需要在Redmine使用的目录服务器上创建一个特殊账户,用于预先认证。可以在账户字段中使用关键词 $login,它将被当前登录名替换。在这种情况下,密码可以留空,例如

Account: [email protected]
或者
Account: company\$login

基础DN变体

尽管基础DN可能是Active Directory的标准配置,但我在雇主那里的Active Directory并不使用用户容器来存储标准用户,所以那些说明让我走了一段漫长而痛苦的路线。我建议也尝试使用“DC=host,DC=domain,DC=org”作为设置,如果登录失败的话。

基于组的LDAP登录

如果您只想允许属于特定LDAP组的用户登录,应遵循以下说明。这些说明基于OpenLDAP LDAP服务器和Redmine 2.3.0。

1. (OpenLDAP服务器) 启用memberof覆盖

1.1. 创建一个文件

vim ~/memberof_add.ldif

以下内容

dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib/ldap
olcModuleLoad: memberof

1.2. 创建一个文件

vim ~/memberof_config.ldif

以下内容

dn: olcOverlay=memberof,olcDatabase={1}hdb,cn=config
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: olcConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf

1.3. 加载它们。这取决于您的OpenLDAP配置,所以我们提出一些可能性

sudo ldapadd -c -Y EXTERNAL -H ldapi:/// -f memberof_add.ldif
sudo ldapadd -c -Y EXTERNAL -H ldapi:/// -f memberof_config.ldif

或者

ldapadd -D cn=admin,cn=config -w "password" -H ldapi:/// -f memberof_add.ldif
ldapadd -D cn=admin,cn=config -w "password" -H ldapi:/// -f memberof_config.ldif

如果您使用动态运行时配置引擎(slapd-config),则无需重启。

1.4.(可选)测试它

ldapsearch -D cn=admin,dc=example,dc=com -x -W -b 'dc=example,dc=com' -H 'ldap://127.0.0.1:389/' '(&(objectClass=posixAccount)(memberOf=cn=ldapredmine,ou=groups,dc=example,dc=com))'

2.(OpenLDAP服务器)创建组。在这个例子中,用户是“ldap_user_1”,组是“ldapredmine”

dn: cn=ldapredmine,ou=groups,dc=example,dc=com
cn: ldapredmine
description: 允许登录到红帽票据系统的员工
member: cn=ldap_user_1,ou=people,dc=example,dc=com
objectclass: groupOfNames
objectclass: top

调整“dn”和“cn”,以适应您的DIT结构

3.(Redmine)编辑LDAP认证模式。在我的情况下,“ldap_user_1”是“posixAccount”对象类

Base DN: dc=example,dc=com
Filter: (&(objectClass=posixAccount)(memberOf=cn=ldapredmine,ou=groups,dc=example,dc=com))

故障排除

如果您想使用即时用户创建,请确保Redmine可以从您的LDAP中检索创建有效用户所需的所有信息。
例如,如果没有在目录中提供有效的电子邮件地址,即时用户创建将无法工作(尝试登录时会收到“无效的用户名/密码”错误消息)。
(在新版本的Redmine中,这不是真的;用户创建对话框将填充从LDAP服务器找到的所有内容,并要求新用户填写剩余内容。)

此外,请确保您没有将任何自定义字段标记为用户账户的必需字段。这些自定义字段会阻止即时创建用户账户。

登录系统中的错误在Redmine日志中不会报告任何真实信息,这使得故障排除变得困难。但是,您可以使用Wireshark在您的Redmine主机和LDAP服务器之间找到大部分您需要的信息。注意,这仅在您有权读取这两个主机之间的网络流量时才有效。

您还可以使用工具 'ldapsearch' 来测试您的设置是否正确。登录到托管 Redmine 的 Linux 机器(可能还需要安装 ldaputils),然后运行以下命令

ldapsearch -x -b  "dc=example,dc=com" -H ldap://hostname/ -D "DOMAIN\USER" -w mypassword [searchterm]

如果成功,您将获得与您的搜索查询相匹配的 AD 内容列表。然后,您将知道如何在 Redmine 的 LDAP 配置中填写字段。

账户值格式

绑定凭据的用户名可能需要指定为 DN 而不是 UPN(例如 )或 domain\user,如 源:trunk/vendor/plugins/ruby-net-ldap-0.0.4/lib/net/ldap.rb 中的此注释所述

  # As described under #bind, most LDAP servers require that you supply a complete DN
  # as a binding-credential, along with an authenticator such as a password.

因此,具有 MyDomain\MyUserName 或 用户名的用户可能只需在 Redmine 登录名中输入 MyUserName。

慢速 LDAP 认证

如果 LDAP 认证速度慢,并且您有 AD 集群,请尝试在主机字段中指定 AD 物理服务器之一(https://redmine.ruby-lang.org.cn/boards/2/topics/3056)。这可能会有所帮助。

OpenDS

如果您正在使用 OpenDS 服务器,您可能会在初始查询中搜索用户时遇到问题,该查询通过指定的登录属性发送请求控制 "分页结果"。默认情况下,匿名用户不允许使用此请求控制 1.2.840.113556.1.4.319,从而阻止 redmine 在绑定之前在目录中找到用户。

添加如下全局 ACI

./dsconfig -h SERVER_IP -p 4444 -D cn="Directory Manager" -w PASSWORD -n set-access-control-handler-prop --trustAll 
--add global-aci:\(targetcontrol=\"1.2.840.113556.1.4.319\"\)\ \(version\ 3.0\;\ acl\ 
\"Anonymous\ control\ access\ to\ 1.2.840.113556.1.4.319\"\;\ allow\ \(read\)\ userdn=\"ldap:///anyone\"\;\)
注意:将命令输入一行,使用与指示完全相同的转义("acl" 后的 \ 表示 " " 的转义,即 "\ ")。

解决方案:

Zentyal 3.2,Redmine 2.3.x

我成功地在 Ubuntu 12.04 LTS 服务器上更新并(重新)设置了我的 Zentyal 3.2。

由于更新 Zentyal 3.2 和 Redmine 2.3 后这让我真的很头疼,所以我喜欢简短地讲述这个故事,并与您分享这个简单的解决方案

使用 zentyals 只读凭据

> Basedomain (Base DN):  dc=your_domain,dc=your_tld
  Rootdomain (Root DN):  cn=zentyal,dc=your_domain,dc=your_tld
  Password:              <admin_secret_pass>
> Read-only root DN:     cn=zentyalro,dc=your_domain,dc=your_tld
> Read-only password:    <ro_secret_pass>
  Default Users DN:      ou=Users,dc=your_domain,dc=your_tld
  Default Groups DN:     ou=Groups,dc=your_domain,dc=your_tld

在 Redmine 中(使用上面的凭据,不要用 <> 包围)并注意更改后的 LDAP 端口 390(阅读上面的文章)

Name     = Just a description for the auth modes page
> Host     = <IP of the host>
> Port     = <390>
  LDAPS    = no
> Account  = <Read-only root DN>
> Password = <ro_secret_pass>
> Base DN  = <Basedomain (Base DN)>

On-the-fly user creation = yes
Attributes
>  Login     = uid
   Firstname = givenName
>  Lastname  = sN
  Email     = mail

Zentyal 4.x,Redmine 3.3.x

使用端口 389 和 sAMAccountName 而不是 uid

Zentyal 5.0,Redmine 3.2

  Name     = Just a description for the auth modes page
  Host     = <IP of the host>
  Port     = <389>
  LDAPS    = no (yes/checked is ok too with Port set to 636)
  Account  = [email protected]
  Password = <username_pass>
  Base DN  = < Default Users DN > (cn=Users,dc=domain,dc=tld)   

On-the-fly user creation = yes
Attributes
   Login     = sAMAccountName
   Firstname = givenName
   Lastname  = sN
   Email     = mail

OpenLDAP,Redmine 3.4.2.stable

  Name     = Some random description
  Host     = <IP of the host>
  Port     = <389>
  LDAPS    = no
  Account  = < Admins DN > (cn=admin,dc=domain,dc=tld)
  Password = < Admins Pass >
  Base DN  = < Default Users DN > (cn=People,dc=domain,dc=tld)   

On-the-fly user creation = yes
Attributes
   Login     = uid
   Firstname = givenName
   Lastname  = sn
   Email     = mail

管理员帐户可以是具有全局读取权限的任何其他 LDAP 帐户。域名和 tld 部分必须与 LDAP 设置相匹配,就像其他所有内容一样。登录属性用于登录。其余内容必须根据 LDAP 设置。

FreeIPA 4.6.8,Redmine 3.2.6

  Name     = Service Description or server name etc.
  Host     = <IP/domain of the host>
  Port     = <389>
  LDAPS    = no ("yes" not tested)
  Account  = uid=<bind username>,cn=users,cn=accounts,dc=<domain>,dc=<tld>
  Password = <bind password>
  Base DN   = cn=accounts,dc=<domain>,dc=<tld>

Attributes
   Login     = uid
   Firstname = givenName
   Lastname  = sn
   Email     = mail

域名和 tld 部分必须与 LDAP 设置相匹配,就像其他所有内容一样。使用 uid 属性进行登录。

最后更新于 Chris Clemson超过 3 年前 · 28 次修订