jelix / ldapdao-module
为 Jelix 开发的模块,允许通过 LDAP 服务器进行身份验证并本地注册用户。
Conflicts
- jelix/jelix: <1.6.21 || >1.7.0-alpha.1 <1.7.0-rc.5
README
这是一个为 Jelix 提供的模块,提供了一个 jAuth 插件,允许使用 DAO 与 LDAP 服务器进行身份验证,并将它们注册到应用程序数据库中。
本模块适用于 Jelix 1.6.x 及更高版本。
安装
使用 Jelix 1.7 进行配置
您应该使用 Composer 安装模块。在 shell 中运行以下命令
composer require "jelix/ldapdao-module"
启动您的应用程序配置器以启用该模块
php yourapp/dev.php module:configure ldapdao
使用 Jelix 1.6 进行配置
将 ldapdao 目录复制到您的应用程序的 modules/ 目录中。
接下来,您必须告诉 Jelix 您想要使用该模块。在 var/config/mainconfig.ini.php 文件中声明它。
在 [modules] 部分,添加
ldapdao.access=1
以下模块是必需的:jacl2、jauth、jauthdb。在同一部分中,请确保它们已启用
jacl2.access=1 jauth.access=2 jauthdb.access=1
如果您使用的是 jCommunity 模块,则不能启用 jauth 和 jauthdb,因此请保留 jauth.access=0 和 jauthdb.access=0。
启动安装程序
在命令行中,启动
php yourapp/install/installer.php
安装其他语言
该模块提供了英文和法文内容。如果您需要其他语言,应从 https://download.jelix.org/jelix/langpacks/ldapdao/ 获取。
解压缩存档到 app/locales/ 或 var/locales/。
配置
本模块提供了两个功能
- 一个 jAuth 的插件,名为
ldapdao - 一个用于 jCoordinator 的
auth插件的配置文件。
ldapdao 插件取代了 jAuth 的 db 或 ldap 插件。模块安装程序禁用了一些 jAcl2 权限,并将配置文件示例 authldap.coord.ini.php 复制到配置目录中
(Jelix 1.6 中的 var/config,Jelix 1.7 中的 app/system)。
您应编辑新的 authldap.coord.ini.php 文件。许多属性应更改以匹配您的 LDAP 结构。
其次,您应在 mainconfig.ini.php 文件的 coordplugins 部分中指示此新配置文件
[coordplugins]
auth="authldap.coord.ini.php"
通用配置属性
首先,您应在 authldap.coord.ini.php 文件的 ldapdao 部分中设置 dao、profile、ldapprofile 和 form 属性,以指示 DAO(用于表)、表单(用于管理模块)以及访问数据库和 LDAP 的配置文件。
以下是一个示例
[ldapdao]
; name of the dao to get user data. It may differ depending
; to the application
dao = "jauthdb~jelixuser"
; name of the form for the jauthdb_admin module. It may differ depending
; to the application
form = "jauthdb_admin~jelixuser"
; profile to use for jDb
profile = "myldapdao"
; profile to use for ldap
ldapprofile = "ldapdao"
对于配置文件,您应在 var/config/profiles.ini.php 文件中设置连接参数。
DAO 配置文件示例
[jdb:myldapdao]
driver="mysqli"
host= "localhost"
database="userdb"
user= "admin"
password="jelix"
persistent= on
force_encoding = on
在此处,配置文件名称为 myldapdao,因此您应在 authldap.coord.ini.php 中设置 profile=myldapdao。
连接配置
您应创建一个名为 ldapprofile 参数中指定的名称的 LDAP 配置文件。LDAP 配置文件应在 var/config/profiles.ini.php 文件中。
例如,如果配置文件名称为 myldap(如下例所示),则应在 authldap.coord.ini.php 中设置 ldapprofile=myldap。
LDAP 连接配置文件示例
[ldap:ldapdao]
hostname=localhost
port=389
tlsMode=starttls ; empty, "starttls" or "ldaps" (ldaps by default if port 636)
adminUserDn="cn=admin,ou=admins,dc=acme"
adminPassword="Sup3rP4ssw0rd"
searchUserBaseDN="dc=XY,dc=fr"
searchUserFilter="(&(objectClass=posixAccount)(uid=%%LOGIN%%))"
bindUserDN="uid=%?%,ou=users,dc=XY,dc=fr"
searchAttributes="uid:login,givenName:firstname,sn:lastname,mail:email"
searchGroupFilter="(&(objectClass=posixGroup)(cn=XYZ*)(memberUid=%%LOGIN%%))"
searchGroupProperty="cn"
searchGroupBaseDN=""
首先,您应设置 hostname 和 port,它们是 LDAP 服务器的名称和端口号。
您还必须指明如何建立连接。您应指明是否使用未加密的 ldap 协议(tlsmode=)、带有 STARTTLS 的 ldap 协议(tlsMode=starttls)或使用 ldaps 协议(tlsMode=ldaps)。
如果您使用标准端口 389,您可以在 tlsMode 设置中选择不加密(空值)或 starttls。
如果您使用端口 636,它将自动使用 ldaps 协议。在这种情况下,将 tlsMode 设置为 ldaps 是可选的。
由于 OpenLdap 中已弃用 ldaps,最佳解决方案是使用端口 389 并设置 tlsMode=starttls。
管理员配置属性
插件需要查询目录,使用具有某些权限的用户,允许搜索用户,获取其属性、其组等... 在插件中,它被称为“管理员”。
您必须在 adminUserDn 和 adminPassword 中指明该用户的 DN(区分名)和密码。
用户数据配置属性
为了验证密码或第一次用户验证时将其注册到 Jelix 应用程序中,插件需要一些关于用户的数据。
您应指明它可以检索哪些 ldap 属性,以及哪些数据库字段将接收 ldap 属性值。
您可以在 searchAttributes 属性中指明此类信息。它是一对名称,<ldap 属性>:<表字段>,用逗号分隔。
在此示例中,searchAttributes="uid:login,givenName,sn:lastname,mail:email,dn:"
uidldap 属性的值将存储在login字段中snldap 属性的值将存储在lastname字段中givenNameldap 属性的值将存储在具有相同名称的字段中,因为没有字段名称也没有:。- 对于
dn属性,没有映射。有一个没有字段名称的:。它将直接从 ldap 读取,并可用于bindUserDNDN 模板(见下文)。
可能的字段列表在 dao 文件中指示,该文件的名称在 dao 配置属性中指明。
认证配置属性
从 2.0.0 版本开始,登录过程已更改,以处理各种 ldap 结构和服务器配置。
在尝试对用户进行 ldap 验证之前,插件会检索用户属性。它使用两个配置参数:searchUserFilter 和 searchAttributes。
searchUserFilter 应包含 ldap 查询和一个 %%LOGIN%% 占位符,该占位符将由用户提供的登录名替换。
示例:searchUserFilter="(&(objectClass=posixAccount)(uid=%%LOGIN%%))"
您还可以在 searchUserBaseDN 中指明搜索的基本 DN。示例:searchUserBaseDN="ou=ADAM users,o=Microsoft,c=US"。
请注意,如果您有复杂的 ldap 结构,您可以指明多个搜索过滤器。使用 [] 来表示项目列表。
searchUserFilter[]="(&(objectClass=posixAccount)(uid=%%LOGIN%%))"
searchUserFilter[]="(&(objectClass=posixAccount)(cn=%%LOGIN%%))"
为了验证密码,插件需要与用户对应的 DN(区分名)。它从 bindUserDN 属性中指明的“模板”和各种数据构建 DN。这些数据可以是提供的登录名或用户的 ldap 属性之一。
-
从用户提供的登录名构建 DN:bindUserDN 应包含一个 DN,其中包含一个
%%LOGIN%%占位符,该占位符将被登录名替换。示例:
bindUserDN="uid=%%LOGIN%%,ou=users,dc=XY,dc=fr"。如果用户提供john.smith作为登录名,则认证将使用 DNbindUserDN="uid=john.smith,ou=users,dc=XY,dc=fr"进行。对于某些LDAP,DN可能是一个简单的字符串,例如一个电子邮件地址。然后您可以设置
bindUserDN="%%LOGIN%%@company.local"。或者如果用户可以输入DN的完整值或电子邮件地址等,甚至可以使用bindUserDN="%%LOGIN%%"(可能不建议允许用户输入自己的完整DN,可能会出现安全问题)。 -
从用户的LDAP属性中构建DN。在这种情况下,插件将首先使用
searchUserFilter过滤器查询LDAP目录,以检索用户的LDAP属性。然后,在bindUserDN中,您可以指定一个DN,其中一些值将被一些属性值替换,或者您也可以指定一个单个属性名称,对应于包含用户完整DN的属性。对于第一种情况,bindUserDN应包含一个DN,其中包含一些
%?%占位符,这些占位符将被相应的属性值替换。例如:bindUserDN="uid=%?%,ou=users,dc=XY,dc=fr"。这里它将%?%替换为从用户属性中读取的uid属性的值。属性名称应包含在searchAttributes配置属性中,即使没有字段映射。例如:...,uid,...。参见上面。对于第二种情况,只需指定属性名称,前面加一个
$。例如:bindUserDN="$dn"。这里它使用从搜索中读取的dn属性,并使用其完整值作为DN来登录到LDAP服务器。这对于某些LDAP服务器(如有时Active Directory)很有用,这些服务器需要为每个用户特定的完整DN。属性名称应包含在searchAttributes配置属性中,即使没有字段映射。例如:...,dn:,...。参见上面。
注意,如果您有复杂的LDAP结构,可以指定多个DN模板。使用 [] 来表示项目列表。
bindUserDN[]="uid=%?%,ou=users,dc=XY,dc=fr"
bindUserDN[]="cn=%?%,ou=users,dc=XY,dc=fr"
用户权限的配置属性
如果您已在应用程序中配置了组权限,并且这些组与您的LDAP组匹配,您可以将插件设置为根据用户的LDAP组自动将用户放入应用程序组。
然后您应在 searchGroupFilter 中指定将检索用户组的LDAP查询。
例如:searchGroupFilter="(&(objectClass=posixGroup)(member=%%USERDN%%))"
%%USERDN%% 将被用户DN替换。%%LOGIN%% 将被登录名替换。
您还可以在 searchAttributes 中指定任何LDAP属性,在 %% 之间。例如:searchGroupFilter="(&(objectClass=posixGroup)(member=%%givenName%%))"
警告:设置 searchGroupFilter 将将用户从任何不匹配LDAP组的其他应用程序组中删除,除非将 searchGroupKeepUserInDefaultGroups 设置为 on。如果您不希望进行组同步,请留空 searchGroupFilter。
使用 searchGroupProperty,您必须指定包含组名称的LDAP属性。例如:searchGroupProperty="cn"。
您还可以在 searchGroupBaseDN 中指定搜索的基本DN。例如:searchGroupBaseDN="ou=Groups,dc=Acme,dc=pt"。