langleyfoxall / laravel-redacted-model
Laravel Redacted Model 允许您轻松地在 Laravel 模型中动态地省略和编辑字段
Requires
- php: ^7.0.0
- illuminate/database: >=5.0
- illuminate/support: >=5.0
This package is auto-updated.
Last update: 2024-09-24 06:01:38 UTC
README
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
变量将被覆盖,但其他任何内容都将追加到现有数组中。