Laravel пустой пароль хешируется при обновлении пользователя

Когда я обновляю свою привязанную к модели форму

$user->update(Input::all())

Поле моего пароля повторно хэшируется, даже если оно пустое. Я установил в своем классе User.php автоматическое хэширование этого поля, но не следует ли его пропустить, так как поле пустое?

3

Решение

Вы можете использовать в этом случае:

Input::except('password')

так что в вашем контроллере вы можете сделать это следующим образом:

if (trim(Input::get('password')) == '') {
$data = Input::except('password');
}
else {
$data = Input::all();
}
$user->update($data);

Однако вы должны рассмотреть другие возможные вопросы для этого. В этом случае, если пользователь отправляет ввод с id имя (и любой может сделать это, даже если у вас нет такого поля в форме), он может легко изменить пароли / учетные записи других пользователей и уничтожить все ваши данные.

Вы должны использовать в своем User модель как минимум:

protected $guarded = array('id');

защитить идентификатор пользователя от изменения во время массовое назначение но, возможно, есть и другие поля, которые вы хотели бы защитить (вы должны перечислить их в $guarded массив.

Для меня гораздо лучшим вариантом в этом случае является использование стандартного пользовательского обновления:

$user = User::find($id);

if (trim(Input::get('password')) != '') {
$user->password = Hash::make(trim(Input::get('password')));
}
$user->name = Input::get('name');
// and so on - this way you know what you are changing and you won't change something you don't want to change
$user->save();
3

Другие решения

Как прокомментировал Том Берд, вот пример кода.

Если вы используете мутатор, как setPasswordAttribute() метод в вашей модели, то вы можете сделать это:

public function setPasswordAttribute($password)
{
if (!empty($password))
{
$this->attributes['password'] = bcrypt($password);
}
}

Это предотвратит хэширование нового пароля. Этот метод setPasswordAttribute () называется «мутатором» и стал доступен в Laravel 4.2 из того, что я вижу. http://laravel.com/docs/4.2/eloquent

3

Поскольку вы отправили все входные данные в модель пользователя, предполагается, что вы хотите обновить все поля, включая пароль, даже если это пустая строка, можно хэшировать пустую строку.

Вам необходимо проверить, является ли пароль пустым и используется ли он Input::except('password')

1

public function update($id)
{
$register = Register::findOrFail($id);
if (empty(Request::get('password'))) {
$data = Request::except('password');
} else {
$data = Request::all();
}
$register->update($data);
return redirect('register');
}
-1
По вопросам рекламы [email protected]