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:"
uid
ldap 属性的值将存储在login
字段中sn
ldap 属性的值将存储在lastname
字段中givenName
ldap 属性的值将存储在具有相同名称的字段中,因为没有字段名称也没有:
。- 对于
dn
属性,没有映射。有一个没有字段名称的:
。它将直接从 ldap 读取,并可用于bindUserDN
DN 模板(见下文)。
可能的字段列表在 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"
。