使用Core PHP验证Silverstripe用户


Authenticate Silverstripe users using Core PHP

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

我的问题:

SilverStripe如何加密它的密码?如何使用纯PHP手动验证用户。对我来说,只有加密/哈希的逻辑(如SilverStripe所做的)用户输入就足够了。

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

作为一个开发人员,你有能力告诉你的客户为什么他可能是错的。

如果网站/应用程序是用SilverStripe构建的,那么他应该有一个非常好的/具体的理由不继续使用它来实现基于SilverStripe数据的API——为此使用SilverStripe是完全有意义的,而为了"不使用SilverStripe"而重写部分SilverStripe框架是没有意义的。

同样重要的是要告诉你的客户,SilverStripe实现的底层加密/哈希算法不是其公共API的一部分,因此可以在不需要明确通知开发人员的情况下进行更改。这可能意味着默认算法可能会改变(例如,如果在blowfish算法中发现零日漏洞),那么你的手机应用就会停止工作。使用SilverStripe API就不会有同样的问题。

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

SilverStripe如何加密其密码?

这取决于-默认方法是使用blowfish算法加密,但有六个左右(在3.4.1中)PasswordEncryptor类的实现可以配置为使用。

使用的算法可以通过Security::$password_encryption_algorithm属性配置,或者通过YAML配置。

每个用户可以使用不同的密码加密/哈希算法-看看PasswordEncryption列下的Member数据库表。

如何使用普通PHP手动认证用户

理论上,如果您想这样做,您需要在框架的身份验证器中重新创建大部分逻辑。从Member::checkPassword开始—这是根据成员检查密码的逻辑的初始化—这是您将关心的。

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


总结
  • 你想要达到的目标将涉及大量的重复
  • 它将不能100%工作的SilverStripe实现
  • 它可能现在工作,但会打破在某个时刻当算法改变
  • 问你的客户为什么,并说服他们改变主意(毕竟,你是专家,他们是客户)
  • 使用SilverStripe API模块(下面列出的一对)

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