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

    Model::unguard();

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

    Model::reguard();
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案
简单来说,是临时取消批量赋值(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文档里并没有搜到这两个方法。。。。

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

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

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

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

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

6年前 评论

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

5年前 评论

@lixiang9194 一切细节,尽在源码中。

先来看看 Model 的定义:

<?php

namespace Illuminate\Database\Eloquent;

.
.
.

abstract class Model implements ...
{
    use Concerns\GuardsAttributes,
     .
     .
     .
}

可以看到,首先 Model 是个抽象类,里面引入了很多 trait ,这里我们重点关注 Concerns\GuardsAttributes ,我们进入这个文件,一切真相大白:

<?php

namespace Illuminate\Database\Eloquent\Concerns;

use Illuminate\Support\Str;

trait GuardsAttributes
{
    .
    .
    .

    /**
     * Indicates if all mass assignment is enabled.
     */
    protected static $unguarded = false;

    /**
     * Disable all mass assignable restrictions.
     */
    public static function unguard($state = true)
    {
        static::$unguarded = $state;
    }

    /**
     * Enable the mass assignment restrictions.
     */
    public static function reguard()
    {
        static::$unguarded = false;
    }

    .
    .
    .
}

可以看到,其实 Laravel 是通过 unguard()reguard() 方法来控制静态变量 unguarded 来实现批量赋值( mass assignment )。

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!