【问题标题】:Adding custom (guarded) field to Laravel 5.3 Auth向 Laravel 5.3 Auth 添加自定义(受保护)字段
【发布时间】:2017-06-05 18:31:36
【问题描述】:

我正在尝试向 Laravel 5.3 用户身份验证添加自定义字段“角色”。该角色将确定用户是否是其他角色中的管理员,因此由于 Auth 脚手架使用大量可分配属性,因此存在漏洞。

因此我将我的用户模型更改为:

protected $guarded = [
  'role'
];

RegisterController 我已经添加了我的自定义字段(默认用户将具有角色 = 客户);

   return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => bcrypt($data['password']),
        'facebook_id' => $data['facebook_id'],
        'linkedin_id' => $data['linkedin_id'],
        'avatar' => $data['avatar'],
        'token' => $data['token'],
        'role' => 'customer',

我收到此错误消息:

SQLSTATE[HY000]:一般错误:1364 字段“角色”没有默认>值(SQL:插入usersnameemailpassword,>facebook_idlinkedin_idavatartokenupdated_at、>created_at) 值(名称、name@domain.co.uk、散列密码、、、、、>2017-01-20 17:21: 16, 2017-01-20 17:21:16))

我这辈子都想不通。

我在想也许我不使用批量可分配输入,但我有一种感觉可能会弄乱 Auth 脚手架的其余部分。

感谢您的帮助

【问题讨论】:

    标签: laravel-5


    【解决方案1】:

    设置默认角色的一种简单方法是在模型中实际定义它

    class User extends Model
    {
        protected $attributes = [
            'role' => 'customer',
        ];
    
        protected $guarded = [
          'role'
        ];
        //...
    

    现在,当您使用 create 方法并且不传递 'role' 属性时,插入将使用值 'customer'

    【讨论】:

    • 好的,谢谢,我明白这是如何工作的,但我仍然有点困惑为什么我的初始方法失败了......!干杯
    • 守卫的重点是你不能通过create(['role'=>'foo'])
    【解决方案2】:

    在添加角色字段的用户表的迁移中,您需要将该字段设置为可为空,或者给它一个默认值,这样当您在没有它的情况下进行批量分配时,数据库知道如何处理那个字段。

    Schema::table('users' function(Blueprint $table){
      $table->string('role')->default('customer');
    });
    

    Schema::table('users' function(Blueprint $table){
      $table->string('role')->nullable();
    });
    

    如果您的代码可以处理空角色值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-18
      • 2020-09-09
      • 2017-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      相关资源
      最近更新 更多