Php 更新用户时正在散列的Laravel空密码

Php 更新用户时正在散列的Laravel空密码,php,laravel,hash,passwords,Php,Laravel,Hash,Passwords,当我用更新模型绑定表单时 $user->update(Input::all()) 我的密码字段被重新哈希,即使它是空的。我已将我的User.php类设置为自动对该字段进行哈希,但由于该字段为空,是否应跳过该类?在这种情况下,您可以使用: Input::except('password') 因此,在控制器中,您可以这样做: if (trim(Input::get('password')) == '') { $data = Input::except('password'); } e

当我用更新模型绑定表单时

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

我的密码字段被重新哈希,即使它是空的。我已将我的User.php类设置为自动对该字段进行哈希,但由于该字段为空,是否应跳过该类?

在这种情况下,您可以使用:

Input::except('password')
因此,在控制器中,您可以这样做:

if (trim(Input::get('password')) == '') {
   $data = Input::except('password');
}
else {
   $data = Input::all();
}
$user->update($data);
但是你应该考虑其他可能的问题。在这种情况下,如果用户使用
id
名称发送输入(任何人都可以这样做,即使您的表单中没有此类字段),他可以轻松更改其他用户的密码/帐户,并销毁您的全部数据

您应在
用户
模型中至少使用:

protected $guarded = array('id');
为了保护用户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();

由于您已将所有输入发送到用户模型,因此它假定您要更新包括密码在内的所有字段,即使密码是空字符串,也可以对空字符串进行散列


您需要检查密码是否为空,以及密码是否为use
Input::except('password')

正如Tom Bird评论的那样,这里有一些代码作为示例

如果在模型中使用类似于
setPasswordAttribute()的mutator
方法,则可以执行以下操作:

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

这将防止对新密码进行哈希运算。此setPasswordAttribute()方法称为“mutator”,在我看到的Laravel 4.2中可用。

Ah,明白了。即使我们设置::all()也会出现这种情况Laravel会很聪明地跳过一个空白字段,但是无论如何…这都可以。谢谢!@ USE2261056和Laravel不跳过它,因为有时你想在表中设置一些文本来空字符串,这是有意义的,只是散列一个空字符串应该返回false并跳过,在我看来,你应该考虑USI。ng
存取器和变异器
http://laravel.com/docs/4.2/eloquent#accessors-和mutators
这会破坏内置密码重置功能,因为它会将您的密码加倍
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');
}