当我用
更新我的模型绑定表单时$user->update(Input::all())
我的密码字段会重新散列,即使它是空的。我已将我的User.php类设置为自动哈希该字段,但是由于字段为空,不应该跳过它?
答案 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');
}