【问题标题】:PHP LDAP session PersistencePHP LDAP 会话持久性
【发布时间】:2019-02-05 23:54:19
【问题描述】:

我正在使用简单的用户身份验证和带有 LDAP 的 CRUD 使用 PHP 开发网站。 我在我的 AD 中设置了规则来指定哪些组可以或不能编辑其他组以及哪些属性可以编辑用户。

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

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

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

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

例如,如果用户想要编辑其密码或名字,ldap_mod_replace() 肯定会返回“Insuficient access”,因为如果没有适当的会话,ldap 可能会尝试匿名绑定.

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

目前,我看到了 2 个对安全性不太友好的解决方案。

  • 首先是存储用户认证信息并绑定到每个页面。

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

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

谢谢。

【问题讨论】:

    标签: php ldap


    【解决方案1】:

    问题不在于 LDAP,问题在于 HTTP。

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

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

    不同的是,在mysql中,没有使用每个用户使用自己的凭证来操作MySQL数据库的概念,一般是设置一个数据库用户作为执行操作的用户。

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

    就像在 MySQL 中一样(例如),当您需要连接到 LDAP 服务器时,您将不得不使用类似单例的东西,它会在每个 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 实现,以查看是否支持此机制。

    【讨论】:

    • 哇,有很多有用的信息,谢谢!您的解决方案非常有趣,我将开始深入研究文档,看看我能用 SASL 做什么。我会带着结果回来的。
    • 或者使用编程语言/运行时环境,您可以使用用户拥有的持久性 LDAP 连接实现多线程服务。
    猜你喜欢
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    相关资源
    最近更新 更多