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

 转自:https://learnku.com/laravel/t/9998/how-do-the-two-methods-of-unguard-reguard-understand

    Model::unguard();

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

    Model::reguard();

简单来说,是临时取消批量赋值(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 文档里并没有搜到这两个方法。。。。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值