我正在使用简单的用户身份验证和LDAP进行CRUD的PHP网站上工作。 我在广告中设置了规则,以指定哪些组可以或不能编辑其他组以及哪些属性可以编辑用户。
问题是,在将用户成功绑定到AD并重定向到另一个页面之后,以前绑定的会话消失了。
Juste在认证之后和重定向之前,函数ldap_exop_whoami()向我返回用户的DN。但是,在重定向之后,它什么也不返回。
我在another post上表示“ PHP LDAP不支持持久连接。”,这是我能够做到的唯一信息找到。
我需要为用户CRUD保留用户会话。
例如,如果用户要编辑密码或名字,ldap_mod_replace()肯定会返回“ 访问权限不足”,因为没有正确的会话,ldap可能尝试了匿名绑定。
由于这种行为,我无法创建简单的用户CRUD是正常的吗?
就目前而言,我看到了2种对安全性不是很友好的解决方案。
第一个方法是存储用户身份验证信息并绑定在每个页面上。
第二个是每次有更新时以管理员身份登录。 出于安全原因,这也是错误的,并且绕过了所有与用户版本有关的AD配置。
我应该处理这种行为吗?也许我应该使用图书馆或其他东西? 我有点迷茫,我所有的“解决方案”都不是很好,所以如果有人有任何提示或想法,我会很乐意的。
谢谢。
答案 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实现,以了解是否支持此机制。