更新用户时,Laravel空密码被哈希处理

时间:2014-10-15 11:09:20

标签: php laravel hash passwords

当我用

更新我的模型绑定表单时
$user->update(Input::all())

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

5 个答案:

答案 0 :(得分: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');

保护用户ID在mass assignment期间不被更改,但也许还有其他一些您希望保护的字段(您应该在$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();

答案 1 :(得分:3)

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

如果你在模型中使用像setPasswordAttribute()方法这样的mutator,那么你可以这样做:

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

这样可以防止对新密码进行哈希处理。这个setPasswordAttribute()方法被称为“mutator”,从我看到的Laravel 4.2中可用。 http://laravel.com/docs/4.2/eloquent

答案 2 :(得分:1)

因为您已将所有输入发送到用户模型,所以它假定您要更新所有字段(包括密码,即使它是空字符串),也可以散列空字符串。

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

答案 3 :(得分:0)

您可以使用的简单方法是 array_filter。 Array_filter 过滤器排除任何空字段。因此,如果您的密码字段为空,则它将不会包含在用户更新模型中,并且当不包含密码字段时,它将不会被散列,因为修改器和访问器仅在模型具有给定属性时才起作用。当您过滤掉字段时,模型不会收到该字段,因此不会散列。您按以下方式使用它...

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

$user->update(array_filter($request->all()));

唯一的问题是它不仅会排除密码,还会排除所有设置为空的字段。

答案 4 :(得分:-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');
}