langleyfoxall/laravel-redacted-model

Laravel Redacted Model 允许您轻松地在 Laravel 模型中动态地省略和编辑字段

1.2.0 2019-02-23 17:48 UTC

This package is auto-updated.

Last update: 2024-09-24 06:01:38 UTC


README

Packagist

Laravel Redacted Model 使您能够根据给定条件轻松地在模型上隐藏或修改字段,以减少 Laravel 应用程序中的数据泄露。

安装

您可以使用 composer 安装 Laravel Redacted Model。在您的项目中运行以下命令。

composer require langleyfoxall/laravel-redacted-model

如果您之前从未使用过 Composer 依赖管理器,请访问 Composer 网站 了解如何开始。

用法

要编辑字段,只需在您的模型中扩展 RedactedModel 并将 redacted 变量设置为要保护的字段数组。默认情况下,访问这些字段将返回 [隐藏数据]

class SensitiveModel extends RedactedModel
{
	protected $redacted = ['name'];
}

条件性编辑数据

要条件性地编辑字段,请覆盖您的模型上的 shouldRedactField。字段名称将传递给此方法。默认情况下,直到您覆盖它,这将返回 true。

注意:只有指定在 $redacted 中的字段才会被编辑,无论此方法返回什么。

class SensitiveModel extends RedactedModel
{
	protected $redacted = ['name'];
	
	public function shouldRedactField($key)
	{
		return !\Auth::user()->canSeeSensitiveFields();
	}
}

更改默认编辑字符串

要更改返回的消息,您可以在模型上设置 redactedString。然后它将返回而不是 [隐藏数据]

class SensitiveModel extends RedactedModel
{
	protected $redacted = ['name'];
	
	protected $redactedString = '[Top Secret]';
}

隐藏字段而不是编辑它们

如果您想完全省略字段而不是编辑它,您可以在模型上设置 redact 变量为 false。

注意:如果 redactKeys 设置为 true,当模型序列化时,编辑字段的键也将被省略。

class SensitiveModel extends RedactedModel
{
	protected $redacted = ['name'];
	
	protected $redact = false;
}

默认情况下,返回 null 且在编辑字段列表中的字段也会被省略,前提是字段名称是敏感的。要禁用此功能,请在模型上将 $redactKeys 设置为 false。

class SensitiveModel extends RedactedModel
{
	protected $redacted = ['name'];
	
	protected $redactKeys = false;
}

编辑值访问器

可以使用访问器来定义特定字段的值,如果它们被编辑。编辑值访问器与 Laravel 访问器 定义方式相同,但以 RedactedValue 结尾而不是 Accessor

方法将传入原始值,这允许您抽象值而不是省略或编辑它。

例如,如果您想返回模型中的名称而不是返回名称,只想返回首尾字母

class SensitiveModel extends RedactedModel
{
	protected $redacted = ['name'];
	
	public function getNameRedactedValue($value)
	{
		return subStr($value, 0, 1).'***'.subStr($value, -1 ,1);
	}
	
}

...

$instanceOfRedactedModel->name // Returns K***y instead of Kathryn Janeway

覆盖默认编辑值

默认情况下,编辑值将返回 [隐藏值]null,具体取决于 $redacted 的值。您可以通过覆盖模型上的 defaultRedactedValue 来绕过此功能。

这对于从原始值派生编辑值很有用,因为字段名称和原始值都会传递给它。例如,如果您想用星号替换所有字符

class SensitiveModel extends RedactedModel
{
	protected $redacted = ['name'];
	
	public function defaultRedactedValue($key, $value)
	{
		return str_repeat("*", strlen($value)); 
	}
}

...

$instanceOfRedactedModel->name // Returns ********** instead of Section 31

启用和禁用保护

如果您想暂时禁用字段编辑或省略,可以在模型上调用 disableProtection() 来禁用保护,并调用 enableProtection() 来重新启用它。这必须按实例使用。

class SensitiveModel extends RedactedModel
{
	protected $redacted = ['name'];
}

...

$instanceOfRedactedModel->name // Returns [Hidden Data]

$instanceOfRedactedModel->disableProtection();

$instanceOfRedactedModel->name // Returns Reginald Barclay

更改编辑字段

如果您在模型实例化后想要更改或添加已删除字段的值,可以在模型上调用 setRedacted 方法。

如果您以数组作为参数调用该方法,则 redacted 变量将被覆盖,但其他任何内容都将追加到现有数组中。