viHARM/php-ldap-auth

用于与目录服务器进行身份验证的PHP库

v2.5.2 2022-03-13 23:14 UTC

This package is auto-updated.

Last update: 2024-09-14 04:49:36 UTC


README

版本2.5.2
变更https://bitbucket.org/viharm/phpldapauth/commits
下载https://bitbucket.org/viharm/phpldapauth/downloads
问题https://bitbucket.org/viharm/phpldapauth/issues
许可证修改后的BSD(3条款)
语言PHP

phpLDAPauth 是一个用于与LDAP服务器进行身份验证的PHP库。如果提供了正确的参数,它将返回身份验证的真/假值。

功能

  • 身份验证:验证用户的凭据是否与现有目录服务匹配。
  • 授权:检查已认证用户是否被授权,基于目录组成员。
  • 获取用户详细信息:如果已认证,则从目录中检索用户的属性。

安装

先决条件

  • PHP 5+ 带LDAP支持
  • 标准Web框架(Web服务器等)
  • phpKhelper(用于调试,作为子模块包含)
  • 目录服务器(例如,OpenLDAP

下载

存档

从本页顶部提供的下载链接获取发布存档。

克隆

克隆仓库。

git clone --recurse-submodules \
https://bitbucket.org/viharm/phpldapauth.git

请记住递归克隆(--recurse-submodules),以确保克隆子模块。

部署

将存档的内容提取到所需目录中。您应该有一个类似以下结构的目录结构

  • <APPLICATION>/ldap/README.md
  • <APPLICATION>/ldap/LICENSE.txt
  • <APPLICATION>/ldap/VERSION.txt
  • <APPLICATION>/ldap/example.php
  • <APPLICATION>/ldap/phpldapauth.php
  • <APPLICATION>/ldap/Lib/
  • <APPLICATION>/ldap/Lib/fl_lib.inc.php
  • <APPLICATION>/ldap/Lib/kint/
  • <APPLICATION>/ldap/Lib/kint/...

用法

此库需要精确的参数集作为关联数组提供,才能正常工作。

通过从类创建一个对象并在代码中使用该对象调用身份验证方法来使用

$Dir = new cl_Dir($DirHost,$DirConf) ;
$AuthResult = $Dir->fn_Auth($Request) ;

所附的文件 example.php 展示了基本功能。有关详细信息,请参阅本节。

输入参数/参数

字符串关联数组的目录设置变量。以下示例显示了在 Debian Wheezy 上典型 OpenLDAP 安装的最低配置

目录主机设置

$DirHost = array (
  'ky_Locn' => 'localhost' ,
  'ky_Port' => '389'
) ;
主机位置

$DirHost['ky_Locn'] 指定目录主机位置。

主机端口

$DirHost['ky_Port'] 指定连接到目录服务的端口号。

目录配置设置

$DirConf = array (
  'ky_LdapType'          => 'openldap ,
  'ky_LdapVer'           => 3 ,
  'ky_LdapFollowReferral' => FALSE ,
  'ky_LdapTLS'            => FALSE ,
  'ky_BaseDn'            => 'dc=domain,dc=tld',
  'ky_UsernameAttrib'    => 'uid' ,
  'ky_GroupnameAttrib'   => 'cn' ,
  'ky_GroupMemberAttrib' => 'memberuid' ,
  'ky_UserContainerRdn'  => 'ou=Users' ,
  'ky_GroupContainerRdn' => 'ou=Groups' ,
  'ar_GroupSearchFilter' => array (
    'objectClass=posixGroup' ,
    'objectClass=sambaGroupMapping'
  )
) ;
基本用法

以下配置选项允许基本使用。

目录类型

$DirConf['ky_LdapType'] 指定LDAP目录服务器的类型。

这可以是以下三种类型之一

  • openldap
  • ad-ds
  • ad-lds

此字段是可选的,默认值是 openldap

目录基础DN

$DirConf['ky_BaseDn'] 指定目录树的基础DN。

在罕见情况下,这可能包括用户容器以进行用户认证。但在这种情况下,应将 $DirConf['ky_UserContainerRdn'] 留空。

然而,这种做法将阻止检查组成员资格,如果组在不同的容器中。

此字段是必需的。

用户名属性

$DirConf['ky_UsernameAttrib'] 指定目录用于存储用户名的属性名称。

这不能映射到任何选择的字段,因为这用于制定将绑定到目录的用户DN。

如果目录服务支持通过电子邮件进行绑定,则可以将它映射到适当的 mail 字段。

此字段是可选的,默认值是 uid

用户容器RDN

$DirConf['ky_UserContainerRdn'] 指定用于在树中存储用户的容器 RDN;例如,ou=Users

尽管可以将用户容器包含在前面提到的 $DirConf['ky_BaseDn'] 中,但始终将它们分开是一个好习惯,以便允许额外的功能,如检查组成员资格。

此字段是可选的,没有默认值。

高级用法

除了上述基本用户认证用法之外,以下配置选项允许额外的功能和用法。

LDAP 协议版本

$DirConf['ky_LdapVer'] 指定与目录服务器一起使用的 LDAP 协议版本。

版本 3 是当前版本,也是大多数目录服务首选的版本。

此字段是可选的,默认值为 3

LDAP 指引

$DirConf['ky_LdapFollowReferral'] 指定在连接到目录服务器后是否跟随指引。

此字段是可选的,默认值是一个布尔值 FALSE

连接加密

$DirConf['ky_LdapTLS'] 指定在连接到目录服务器后是否使用 TLS。

由于 SSL 已被弃用,因此不建议使用 SSL(ldaps)。请注意,此方法首先在不加密的情况下连接到目录服务器(通常在标准端口 389 上)。然后与服务器协商以升级连接到安全的 TLS。

现有的 SSL 连接(ldaps)无法升级到 TLS。

此字段是可选的,默认值是一个布尔值 FALSE

组名属性

$DirConf['ky_GroupnameAttrib'] 指定目录用于存储组名的属性名。

当希望仅在用户是组成员时进行用户认证时,这很有用。

此字段是可选的,默认值为 cn

组成员属性

$DirConf['ky_GroupMemberAttrib'] 指定目录用于在组对象内部存储成员用户名的属性名。

当希望仅在用户是组成员时进行用户认证时,这很有用。

此字段是可选的,默认值为 memberuid

组容器 RDN

$DirConf['ky_GroupContainerRdn'] 指定用于在树中存储组的容器 RDN;例如,ou=Groups

如果用户和组在目录树中的同一个容器中(或树的基础中),则可以在 $DirConf['ky_BaseDn'] 中指定该容器的 DN。

尽管可以将组容器包含在前面提到的 $DirConf['ky_BaseDn'] 中,但始终将它们分开是一个好习惯。

此参数是可选的,没有默认值。

组搜索过滤器

如果目录结构是按非标准对象设置的组,则可以根据环境覆盖默认组过滤器。

$DirConf['ar_GroupSearchFilter'] 是一个非关联数组,包含过滤器。每个数组项是一个过滤器条件,在运行时通过 phpLDAPauthOR 逻辑组合。

此参数是可选的。默认过滤器由以下 OR 组成的条件组成

  • objectClass=posixGroup
  • objectClass=sambaGroupMapping

请求

搜索请求封装在一个字符串的 'Request' 关联数组中

$Request = array (
  'ky_UserKeyword'  => 'username' ,
  'ky_UserPassword' => 'password' ,
  'ky_UserDomain'   => 'userdomain' ,
  'ky_GroupKeyword' => 'usersgroup' ,
) ;
用户名

$Request['ky_UserKeyword'] 指定要认证的用户名。

此用户名用于构建 DN,用于与目录进行绑定以进行认证。

此字段是必需的。

密码

$Request['ky_UserPassword'] 指定用于认证时与用户名一起使用的密码。

这将以纯文本形式传递给目录服务。

此字段是必需的。

用户域

$Request['ky_UserDomain'] 指定用户所属的域。

这是对 Active Directory(DS 和 LDS)服务器必需的。

该字段对于OpenLDAP服务器不是必需的,因此可以忽略;但对于AD DS和AD LDS目录服务器(通过$DirConf['ky_LdapType']选择)是必需的,没有默认值。如果选择的LDAP服务器类型需要此值,确保指定一个合理值是部署者的责任。

$Request['ky_GroupKeyword']指定了用于检查用户成员资格的组名。

这可以用来检查用户是否是某个组的成员。

此字段是可选的,没有默认值。

用户属性

如果身份验证成功,phpLDAPauth提供了一个选项来获取用户详情。最常见的情况是将本地应用程序数据库与目录服务的最新信息同步。

这需要一个字符串关联数组的属性名列表。以下是一个简单的示例。

$RequiredAttributes = array (
  'cn' ,
  'sn' ,
  'displayName' ,
  'objectClass' ,
  'mail'
  ) ;

响应

函数返回一个包含三个布尔元素和第四个数组(或NULL)元素的关联数组。

$Result = array (
  'ky_User_Authenticated' => FALSE,
  'ky_Group_Exists'       => FALSE,
  'ky_Group_ContainsUser' => FALSE,
  'ar_UserAttrib'         => NULL
) ;

用户身份验证

$Result['ky_User_Authenticated']在请求中指定的用户$Request['ky_UserKeyword']成功绑定到目录时设置为TRUE

组存在性

$Result['ky_Group_Exists']在请求中指定的组$Request['ky_GroupKeyword']存在时设置为TRUE

这不受认证用户是否为该组成员的影响。

如果用户未认证,则设置为FALSE

组成员资格

$Result['ky_Group_ContainsUser']在请求中指定的用户$Request['ky_UserKeyword']属于请求中指定的组$Request['ky_GroupKeyword']时设置为TRUE

如果用户未认证,则设置为FALSE

用户详情

如果用户已认证,$Result['ar_UserAttrib']作为关联数组返回。

$Result['ar_UserAttrib'] = array (
  'cn'            => array ( 'count' => 1 , 0 => 'Anthony Smith' ) ,
  'sn'            => array ( 'count' => 1 , 0 => 'Smith' ) ,
  'displayName'   => array ( 'count' => 1 , 0 => 'Anthony Smith' ) ,
  'objectClass'   => array ( 'count' => 5 , 0 => 'inetOrgPerson' , 1 => 'posixAccount' , 2 => 'top' , 3 => 'extensibleObject' , 4 => 'sambaSamAccount' ) ,
  'mail'          => array ( 'count' => 3 , 0 => 'anthony.smith@domain.tld' , 1 => 'anthony.smith@local' , 2 => 'tony.smith@domain.tld' )
  ) ;

每个元素都有一个与请求的属性相等的字符串键。每个元素的值是一个至少包含两个元素的数组,如下所示。

  • count包含特定属性的值数量。
  • 012等包含值。

如果在目录服务器上找不到特定属性,则保持子数组结构以提供一致的输出,但是count设置为0,而0的值是NULL。例如,如果请求了属性loginShell,但在目录中找不到,则会收到以下响应。

$Result['ar_UserAttrib'] = array (
  'loginShell'            => array ( 'count' => 0 , 0 => NULL ) ,
  ) ;

如果用户未认证,则此元素的值为NULL

$Result['ar_UserAttrib'] = NULL

已知限制

有关当前已知限制的完整列表,请参阅

支持

可以通过将布尔值$GLOBALS['bl_DebugSwitch']设置为TRUE来启用调试。

$GLOBALS['bl_DebugSwitch'] = TRUE ;

有关问题、查询、建议和评论,请创建问题(在本页顶部有一个链接)。

贡献

请随时克隆/分叉并通过拉取请求进行贡献。也欢迎通过比特币捐赠,地址为16is9G5dCHSnjnGxCUZRkjBWpS6a99ZA7G。请创建问题以了解其他捐赠或贡献方式。

请联系以获取更多信息。

环境

已知兼容的平台和软件堆栈

  • 服务器操作系统
    • Debian 7 Wheezy
    • Debian 8 Jessie
    • Debian 9 Stretch
    • Debian 10 Buster
    • Ubuntu 14.04
  • 客户端操作系统
    • Debian Wheezy
    • Debian Jessie
    • Debian Stretch
    • Kubuntu 20.04
    • Windows 7
    • Windows 10
  • Web服务器
    • Apache 2.2
    • Apache 2.4
    • NGINX 1.10.3
    • NGINX 1.14
  • PHP
    • 5.4
    • 5.5
    • 7.0
    • 7.3
  • 目录服务器
    • OpenLDAP 2.4
    • AD(包括DSLDS)在Windows Server 2012上

许可证

根据修改后的BSD(3条款)许可协议授权。

许可证副本可在以下位置找到...

致谢

工具

Kint

Kint 调试库 (http://raveren.github.io/kint/),在 MIT 许可下使用。

版权所有 (c) 2013 Rokas Å leinius (raveren at gmail dot com)。

实用工具

Codiad

Codiad 基于网络的 IDE (https://github.com/Codiad/Codiad),在 MIT 风格许可下使用。

版权所有 (c) Codiad & Kent Safranski (codiad.com)。

VS Code

Visual Studio Code 代码编辑器,在 Microsoft 软件许可 下使用。

SmartGit

SmartGit 是 Git 的客户端 (http://www.syntevo.com/smartgit/),在非商业软件许可下使用。

版权所有 syntevo GmbH。

Git Extensions

Git Extensions 是 Git 的客户端 (https://gitextensions.github.io/),在 GNU GPL v3 许可下使用。

版权所有 https://github.com/gitextensions

jEdit

jEdit 文本编辑器 (http://www.jedit.org/),在 GNU GPL v2 许可下使用。

版权所有 (C) jEdit 作者。

Kate

文本编辑器,在 GNU Lesser General Public Licence Version 2 许可下使用。

版权所有 (c) 2000-2019 The Kate Authors

BitBucket

BitBucket 代码仓库托管 (www.bitbucket.org)。

Atlassian 提供支持 (www.atlassian.com)。

测试