jelix/ldapdao-module

为 Jelix 开发的模块,允许通过 LDAP 服务器进行身份验证并本地注册用户。

安装数: 44,697

依赖项: 1

建议者: 0

安全性: 0

星标: 0

关注者: 4

分支: 2

开放问题: 1

类型:jelix-module

v2.2.5 2023-10-09 07:59 UTC

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=0jauthdb.access=0

启动安装程序

在命令行中,启动

php yourapp/install/installer.php

安装其他语言

该模块提供了英文和法文内容。如果您需要其他语言,应从 https://download.jelix.org/jelix/langpacks/ldapdao/ 获取。

解压缩存档到 app/locales/var/locales/

配置

本模块提供了两个功能

  1. 一个 jAuth 的插件,名为 ldapdao
  2. 一个用于 jCoordinator 的 auth 插件的配置文件。

ldapdao 插件取代了 jAuth 的 dbldap 插件。模块安装程序禁用了一些 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 部分中设置 daoprofileldapprofileform 属性,以指示 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=""

首先,您应设置 hostnameport,它们是 LDAP 服务器的名称和端口号。

您还必须指明如何建立连接。您应指明是否使用未加密的 ldap 协议(tlsmode=)、带有 STARTTLS 的 ldap 协议(tlsMode=starttls)或使用 ldaps 协议(tlsMode=ldaps)。

如果您使用标准端口 389,您可以在 tlsMode 设置中选择不加密(空值)或 starttls

如果您使用端口 636,它将自动使用 ldaps 协议。在这种情况下,将 tlsMode 设置为 ldaps 是可选的。

由于 OpenLdap 中已弃用 ldaps,最佳解决方案是使用端口 389 并设置 tlsMode=starttls

管理员配置属性

插件需要查询目录,使用具有某些权限的用户,允许搜索用户,获取其属性、其组等... 在插件中,它被称为“管理员”。

您必须在 adminUserDnadminPassword 中指明该用户的 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 验证之前,插件会检索用户属性。它使用两个配置参数:searchUserFiltersearchAttributes

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 作为登录名,则认证将使用 DN bindUserDN="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"