unguard / reguard 这二个方法怎么理解?

    Model::unguard();

    $this->call(UsersTableSeeder::class);

    Model::reguard();
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案
简单来说,是临时取消批量赋值(mass assignment)保护,因为此时可能需要批量对is_admin等敏感属性进行赋值,而为了安全这是不允许的。

我尝试来总结一下这个问题:

1.什么是mass assignment

laravel文档中经常会提到mass assignment,我简单翻译为批量赋值,其实质是为了防止用户恶意注入数据,保护数据的安全。

举例来说,你的用户表有users里有is_admin属性,标识该用户是否为管理员,正常情况下你当然不希望用户自己设置此属性。但如果你包含了如下代码:

$user = new User(input::all())

则用户可能恶意构造数据,同时提交了name、password、is_admin等字段,从而将自己设置为管理员,这就带来了安全问题。

2.解决方案

于是,laravel提供了两种解决方案。

其一:即设置fillable属性,列入针对上述问题,设置

protected $fillable = ['name', 'password', 'email'];

此时即使用户提交了is_admin属性也会被忽略。那么我们如何才能设置此属性呢?单独赋值,即

$user->is_admin = true; 
$user->save();

这种方式教程里面也有涉及。

其二:设置guarded属性

protected $guarded = ['is_admin'];

注意,guarded属性是仅保护这个属性,其余所有属性均可批量赋值,与fillable刚好相反,两种方式任选一种即可

laravel参考文档:mass assignment

3.为什么要有model::unguard()

至此,为什么要unguard然后guard应该就十分清楚了,从方法名很容易就看出来。

为了批量填充数据,当然要暂时性关闭安全保护,填充完毕后重新打开保护。

当然,此处还有一点问题,就是我在laravel文档里并没有搜到这两个方法。。。。

如果你看到了欢迎补充链接

1年前 评论
讨论数量: 4
简单来说,是临时取消批量赋值(mass assignment)保护,因为此时可能需要批量对is_admin等敏感属性进行赋值,而为了安全这是不允许的。

我尝试来总结一下这个问题:

1.什么是mass assignment

laravel文档中经常会提到mass assignment,我简单翻译为批量赋值,其实质是为了防止用户恶意注入数据,保护数据的安全。

举例来说,你的用户表有users里有is_admin属性,标识该用户是否为管理员,正常情况下你当然不希望用户自己设置此属性。但如果你包含了如下代码:

$user = new User(input::all())

则用户可能恶意构造数据,同时提交了name、password、is_admin等字段,从而将自己设置为管理员,这就带来了安全问题。

2.解决方案

于是,laravel提供了两种解决方案。

其一:即设置fillable属性,列入针对上述问题,设置

protected $fillable = ['name', 'password', 'email'];

此时即使用户提交了is_admin属性也会被忽略。那么我们如何才能设置此属性呢?单独赋值,即

$user->is_admin = true; 
$user->save();

这种方式教程里面也有涉及。

其二:设置guarded属性

protected $guarded = ['is_admin'];

注意,guarded属性是仅保护这个属性,其余所有属性均可批量赋值,与fillable刚好相反,两种方式任选一种即可

laravel参考文档:mass assignment

3.为什么要有model::unguard()

至此,为什么要unguard然后guard应该就十分清楚了,从方法名很容易就看出来。

为了批量填充数据,当然要暂时性关闭安全保护,填充完毕后重新打开保护。

当然,此处还有一点问题,就是我在laravel文档里并没有搜到这两个方法。。。。

如果你看到了欢迎补充链接

1年前 评论
简单来说,是临时取消批量赋值(mass assignment)保护,因为此时可能需要批量对is_admin等敏感属性进行赋值,而为了安全这是不允许的。

我尝试来总结一下这个问题:

1.什么是mass assignment

laravel文档中经常会提到mass assignment,我简单翻译为批量赋值,其实质是为了防止用户恶意注入数据,保护数据的安全。

举例来说,你的用户表有users里有is_admin属性,标识该用户是否为管理员,正常情况下你当然不希望用户自己设置此属性。但如果你包含了如下代码:

$user = new User(input::all())

则用户可能恶意构造数据,同时提交了name、password、is_admin等字段,从而将自己设置为管理员,这就带来了安全问题。

2.解决方案

于是,laravel提供了两种解决方案。

其一:即设置fillable属性,列入针对上述问题,设置

protected $fillable = ['name', 'password', 'email'];

此时即使用户提交了is_admin属性也会被忽略。那么我们如何才能设置此属性呢?单独赋值,即

$user->is_admin = true; 
$user->save();

这种方式教程里面也有涉及。

其二:设置guarded属性

protected $guarded = ['is_admin'];

注意,guarded属性是仅保护这个属性,其余所有属性均可批量赋值,与fillable刚好相反,两种方式任选一种即可

laravel参考文档:mass assignment

3.为什么要有model::unguard()

至此,为什么要unguard然后guard应该就十分清楚了,从方法名很容易就看出来。

为了批量填充数据,当然要暂时性关闭安全保护,填充完毕后重新打开保护。

当然,此处还有一点问题,就是我在laravel文档里并没有搜到这两个方法。。。。

如果你看到了欢迎补充链接

1年前 评论

seed 的时候好像会默认关闭 model 的 guard ??

1年前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!