madmatt/silverstripe-uuid

一个允许在 Silverstripe DataObjects 上轻松使用 UUID 的模块

安装数: 1,631

依赖者: 0

建议者: 0

安全: 0

星星: 2

关注者: 4

分支: 1

开放问题: 1

类型:silverstripe-vendormodule

dev-master 2020-07-11 13:07 UTC

This package is auto-updated.

Last update: 2024-09-11 21:48:04 UTC


README

本模块提供了一个生成、存储和通过 UUID 获取 DataObject 的便捷系统,而不是 Silverstripe CMS 默认提供的自增 ID。

本模块 不会 替换自增 ID 系统,它仍然被用作所有表的常规主键。它只是增加了一个辅助 UUID 作为访问对象的另一种方式。因此,它也不提供使用 UUID 可以提供的数据库级别的优势(例如,在多主复制设置中异步创建对象唯一 ID 的能力)。

使用此模块的关键原因是确保您不会向潜在攻击者泄露有关系统的信息。您应在任何面向公众的上下文中使用 UUID 而不是自增 ID 来引用对象的唯一标识符。

例如,查看单个成员个人资料的 URL 可能是 /members/view-profile/ae9d059a-88b7-4480-b9fa-07b63e480e9a 而不是 /members/view-profile/273。这确保了攻击者无法通过简单地添加或减去数字来轻松猜测其他 ID,更重要的是,确保没有人知道您有多少客户等。

需求

  • SilverStripe ^4.0

安装

composer require madmatt/silverstripe-uuid

快速使用

使用此模块有两种方式

  • 简单但不可定制的使用方式(添加 UUIDExtension
  • 高级、DIY 的方式(使用一个或多个 UUIDField

您选择哪种方式取决于您想如何使用此模块 - 特别是仔细审查下面的详细信息,以了解每个选项的含义。

简单:添加 UUIDExtension

使用此模块的最简单方法是向任何您想要生成 UUID 的 DataObject 添加 UUIDExtension

使用 YAML

App\Model\MyDataObject:
  extensions:
    - 'Madmatt\UUID\UUIDExtension'

使用 PHP

<?php
namespace App\Model;

use SilverStripe\ORM\DataObject;
use Madmatt\UUID\UUIDExtension;

class MyDataObject extends DataObject
{
    private static $extensions = [
        UUIDExtension::class
    ];
}

以上两种方法都会在您的 MyDataObject 表上创建一个名为 'UUID' 的新列,并且每次对象保存时(包括添加扩展后的第一次 dev/build,所有现有记录都会生成并存储 UUID)。UUID 只会写入一次,一旦创建就必须永远不变(例如,如果您尝试在代码中编辑它,则在写入对象时会抛出 Exception)。

然后您可以使用它就像使用任何其他 DB 字段一样,例如

namespace App\Model;

use SilverStripe\Control\Controller;
use SilverStripe\ORM\DataObject;

class MyDataObject extends DataObject
{
    public function Link()
    {
        // Returns: /members/view-profile/ae9d059a-88b7-4480-b9fa-07b63e480e9a
        return Controller::join_links('members', 'view-profile', $this->UUID);
    }
}

复杂:添加一个或多个 UUIDField 数据库字段

或者,您可以通过创建自己的数据库字段 Madmatt\UUID\UUIDField 来实现此功能,例如

<?php
namespace App\Model;

use SilverStripe\ORM\DataObject;
use Madmatt\UUID\UUIDField;

class MyDataObject extends DataObject
{
    private static $db = [
        'MyCustomUUID' => UUIDField::class
    ];
}

如果您使用此方法,您需要自己处理 UUID 的生成(例如,实现自己的 onBeforeWrite() 方法等)。模块不会确保 UUID 永远不变,因此如果您使用此方法,请谨慎使用它作为主键。

定制

默认情况下,此模块将生成随机 UUID(使用 UUIDv4),除非您特别希望编码 UUID 生成的日期/时间或生成它的机器等详细信息,否则建议这样做。

您可以全局更改此设置(但是已生成的现有 UUID 不会被重新生成,更改后已生成一些 UUID 的效果尚未测试)。

---
Name: uuid-override
After: '#uuid-base-config'
---
Madmatt\UUID\UUIDField:
  uuid_version: uuidv1

我们不官方支持“非标准UUID”,例如有序时间UUID和微软的类似名称GUID格式,但如果您想添加对这些格式的支持,请随时提交拉取请求。这些由底层ramsey/uuid库支持,所以只需要将它们连接起来即可。

您可以从以下列表中定义您想要使用的UUID风格

  • uuidv1:基于时间的
  • uuidv4:随机的

请注意,不支持对UUID生成过程的自定义输入(例如,UUIDv1的自定义节点值或时钟序列)。

这意味着以下不支持

  • uuidv2:DCE安全(需要指定的“域”值)
  • uuidv3:基于名称(MD5)(需要命名空间类型和值)
  • uuidv5:基于名称(SHA-1)(需要命名空间类型和值)

如果您需要V2、V3或V5 UUID以满足您的需求,请提交拉取请求以帮助解决这个问题。

许可证

查看许可证

维护者

错误追踪器

错误在本存储库的问题部分跟踪。在提交问题之前,请先阅读现有问题,以确保您的问题具有唯一性。

如果问题看起来像是一个新错误

  • 创建一个新的问题
  • 描述重现您的问题所需的步骤和预期结果。单元测试、屏幕截图和屏幕录制在这里可能会有所帮助。
  • 尽可能详细地描述您的环境:SilverStripe版本、浏览器、PHP版本、操作系统、任何安装的SilverStripe模块。

请直接通过电子邮件将安全问题报告给模块维护者,电子邮件地址为signups+uuidsecurity [at] madman.dev。请不要在错误追踪器中报告安全问题。

开发和贡献

如果您想为模块做出贡献,请提交拉取请求。如果您想帮忙但不确定如何操作,请随时提出一个问题——我们很乐意帮助您!