【问题标题】:Authenticate Silverstripe users using Core PHP使用 Core PHP 验证 Silverstripe 用户
【发布时间】:2017-03-24 05:12:10
【问题描述】:

我的客户有一个使用 SilverStripe 制作的网站和后端。现在客户想要一个移动应用程序,为此他希望我构建一个 API 来与数据库通信。不幸的是,他希望我使用其他一些框架,甚至是带有 PDO 的核心 PHP 实现。

我的问题:

SilverStripe 如何加密其密码?如何使用纯 PHP 手动验证用户身份。只有用户输入的加密/散列逻辑(就像 SilverStripe 那样)对我来说就足够了。

【问题讨论】:

  • 我强烈建议将其添加到 ss github.com/silverstripe/silverstripe-restfulserver .. 将简化创建与应用程序之间对话的中间件位。或者只是让应用程序直接使用它。然后可以根据客户的需要创建与 api 对话的 api :)
  • @FinBoWa,问题是客户不想使用 silverstripe 为移动设备构建 Web 服务。
  • 是的,我从您的问题中了解到这一点,但不得不建议,数据仍然在 silverstripe 中吗?该模块允许您通过简单的请求访问 xml 或 json 格式的数据,因此可以节省大量时间。您可以创建将 xml/json 输出转换为您喜欢的任何语言的移动应用程序的中间件,但是您可以通过一种简单的方式与 SS 进行对话,而无需创建新的方式来执行此操作。

标签: php silverstripe


【解决方案1】:

不幸的是,他希望我使用其他框架,甚至是带有 PDO 的核心 PHP 实现

作为开发人员,您有能力告诉您的客户为什么他在这方面可能错了。

如果网站/应用程序是使用 SilverStripe 构建的,那么他应该有一个非常好的/特定的理由不继续使用它来在 SilverStripe 数据之上实现 API - 为此使用 SilverStripe 非常有意义,并且为了“不使用 SilverStripe”而重写 SilverStripe 框架的某些部分毫无意义。

向您的客户提及,SilverStripe 实现的底层加密/散列算法不是其公共 API 的一部分也很重要,因此无需向开发人员明确通知即可更改。这可能意味着可以更改默认算法(例如,如果在河豚算法中发现零日漏洞),您的移动应用程序将停止工作。使用 SilverStripe API 不会有同样的问题。

以上内容也适用于 SilverStripe 的一般数据结构。让我们假设有一天他们决定从平面表转移到 EAV 数据库存储设计 - 他们的公共 API(具有公共方法的类)将保持不变,而将可访问性与处理和数据存储分开的后端类将发生变化。 如果你自己构建它,你也必须更新你的 API!

SilverStripe 如何加密其密码?

这取决于 - the default method is encryption with the blowfish algorithm,但有半打左右(在 3.4.1 中)implementations of the PasswordEncryptor class 可以配置为使用。

要使用的算法可通过Security::$password_encryption_algorithm 属性或 YAML 配置进行配置。

每个用户都可以使用不同的密码加密/散列算法 - take a lookMember 数据库表的PasswordEncryption 列下。

如何使用纯 PHP 手动验证用户身份

理论上,如果您想这样做,您需要在框架的身份验证器中重新创建大部分逻辑。首先查看Member::checkPassword - 这是针对成员检查密码的逻辑的启动 - 这是您所关心的。

您会发现自己假设大多数 SilverStripe 实现将使用默认的河豚加密算法,并遵循 PasswordEncryptor::create_for_algorithmPasswordEncryptor_Blowfish::check。在这一点上,您将看到您最终将复制大量 SilverStripe 框架的代码以实现您想要的。


总结

  • 您想要实现的目标将涉及大量重复
  • 它不适用于 100% 的 SilverStripe 实现
  • 它现在可能有效,但在算法更改时会在某个时候中断
  • 询问您的客户原因,并说服他们改变主意(毕竟,您是专家,他们是客户)
  • 使用 SilverStripe API 模块(下面列出的一对)

API 模块

  • silverstripe/silverstripe-restfulserver - 官方支持,并提供了一种简单易用的方法来开始提供对 SilverStripe 系统的 API 访问。您可以对 HTTP 请求方法进行基本控制,并且可以限制每个 DataObject 的访问和权限。
  • colymba/silverstripe-restfulapi - 社区模块。可以说更加灵活和强大。设置/配置您想要的工作方式需要做更多的工作。

【讨论】:

  • 不使用 Silverstripe 的原因是,它非常慢。数据库中有几百万条数据,当我将 silverstripe 代码(由以前的程序员编写)与简单的 PDO 进行比较时,代码快了 10 倍。所以他不想使用银条。此外,在不久的将来,他想用其他一些框架重新编码他的后端系统,最好是 phalcon 或 laravel。在我的情况下,我可以做的是在验证用户时调用 Silverstripe 的登录页面。
  • 如果你下定了决心,那就下定了,但我还建议通过实现一个 silverstripe API,然后定义一种 interface 的形式。然后,当/如果您更改框架时,您只需要确保新 API 符合与以前相同的架构/接口,并且可能不需要更新您的移动应用程序
  • SilverStripe 也很慢 - 您可以选择:优化它,或将直接 DB 查询写入您自己的 API 控制器中在 SilverStripe 框架内。 当然,您可以复制逻辑如果您愿意,但没有人会建议将其作为最佳做法
  • 我只需要指出,对于任何给定的框架,您都可以期望达到一个点,即您只需要重构一些代码以提高性能;可能是将一些查询交换为原始查询,将一些原始快速完成的脚本调整为更好的脚本,或者只是开始在服务器环境上投入资金。它们都应该/可能比开始迁移到新框架更具成本效益。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
  • 2016-06-26
  • 2021-05-16
  • 2022-11-17
相关资源
最近更新 更多