PHP LDAP会话持久性

时间:2019-02-04 15:31:14

标签: php ldap

我正在使用简单的用户身份验证和LDAP进行CRUD的PHP网站上工作。 我在广告中设置了规则,以指定哪些组可以或不能编辑其他组以及哪些属性可以编辑用户。

问题是,在将用户成功绑定到AD并重定向到另一个页面之后,以前绑定的会话消失了。

Juste在认证之后和重定向之前,函数ldap_exop_whoami()向我返回用户的DN。但是,在重定向之后,它什么也不返回。

我在another post上表示“ PHP LDAP不支持持久连接。”,这是我能够做到的唯一信息找到。

我需要为用户CRUD保留用户会话。

例如,如果用户要编辑密码或名字,ldap_mod_replace()肯定会返回“ 访问权限不足”,因为没有正确的会话,ldap可能尝试了匿名绑定。

由于这种行为,我无法创建简单的用户CRUD是正常的吗?

就目前而言,我看到了2种对安全性不是很友好的解决方案。

  • 第一个方法是存储用户身份验证信息并绑定在每个页面上。

  • 第二个是每次有更新时以管理员身份登录。 出于安全原因,这也是错误的,并且绕过了所有与用户版本有关的AD配置。

我应该处理这种行为吗?也许我应该使用图书馆或其他东西? 我有点迷茫,我所有的“解决方案”都不是很好,所以如果有人有任何提示或想法,我会很乐意的。

谢谢。

1 个答案:

答案 0 :(得分:0)

问题不是关于LDAP,问题是关于HTTP。

HTTP是无状态协议,而LDAP是有状态协议。

发出HTTP请求时,您的PHP脚本将被执行并在发送响应时终止,这会破坏脚本中创建的内容(与终止PHP脚本时关闭mysql连接的方式相同)。

区别在于,在mysql中,每个用户的概念都使用其自己的凭据来操作MySQL数据库,因此通常不设置数据库用户,而该用户充当执行操作的用户。

在LDAP中,您想更改此行为,因为它不安全,但是……一直如此。

因此,例如在MySQL中,例如,当您需要连接到LDAP服务器时,您将不得不使用诸如singleton之类的东西来在每个PHP脚本的开头启动LDAP连接。如您所说,要做到这一点,您有2个解决方案:

  • 存储用户凭据,并使用它们在每个页面上打开连接
  • 使用技术帐户提出请求

区别在于LDAP实施中存在一种机制,可以使技术帐户充当用户。并充当用户,其含义是修改将归功于该用户(例如,将在createdBy操作属性中为该用户创建的条目引用该用户)

看看这个文档,看看如何实现这种行为:

http://php.net/manual/en/function.ldap-sasl-bind.php

https://www.openldap.org/doc/admin24/sasl.html(第15.3. SASL Proxy Authorization节)

注意:您将需要检查所使用的LDAP实现,以了解是否支持此机制。