2017-01-20 2 views
0

Я пытаюсь добавить настраиваемое поле 'role' в Laravel 5.3 User Auth. Роль будет определять, является ли пользователь администратором среди других ролей, и потому, что в Auth-подклассах используются массовые назначаемые атрибуты, существует уязвимость.Добавление пользовательского (защищенного) поля в 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]: General error: 1364 Field 'role' doesn't have a default >value (SQL: insert into users (name , email , password , >facebook_id , linkedin_id , avatar , token , updated_at , >created_at) values (name, [email protected], hashed password, , , , , >2017-01-20 17:21:16, 2017-01-20 17:21:16))

не могу за жизнь мне понять это.

Я думал, что, возможно, я не использую массовый назначаемый вход, но у меня есть чувство, которое может испортить остальную часть эшафот Auth.

Спасибо за любую помощь

ответ

1

Простой способ установить роль по умолчанию является на самом деле определить его в модели

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

    protected $guarded = [ 
     'role' 
    ]; 
    //... 

Теперь, когда вы используете метод создания и не проходят в 'role' атрибут, вставка будет использовать значение 'customer'

+0

ОК спасибо, я понимаю, как это работает, я все еще немного смущен, почему мой первоначальный метод не удается, хотя ..! Cheers – Ash

+0

весь смысл охраняемого вы не можете передать 'create (['role' => 'foo'])' – Moak

0

В вашей миграции для таблицы пользователей, в которой вы добавляете поле роли, вам необходимо установить это поле как значение NULL или присвоить значение по умолчанию, чтобы при массовом assig n без него, база данных знает, как бороться с этим полем.

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

или

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

если ваш код может иметь дело с нулевым значением роли.

Смежные вопросы