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');
}