所以我有一个相当奇怪的问题。我创建了一个允许用户更改密码的表单。
确实会更改密码。但它将密码更改为Laravel显然无法识别的内容。
因此,如果我使用“修补程序”手动将密码更新为“测试”之类的内容;我能够成功更改密码。但是,一旦我将密码更改为某些内容(例如123456),表单就不会接受密码。
当我退出用户并尝试使用新密码登录时;它不会让我登录。
很明显,Laravel没有识别新密码。
代码在这里:
查看:
<div class="panel panel-default">
<div class="panel-heading">Change Your Password</div>
{{ Form::open(array('url' => 'security/change_password')) }}
<div class="form-group">
{!! Form::label('current_password', 'Enter Current Password:') !!}
{!! Form::text('current_password', null, ['class'=>'form-control']) !!}
</div>
<div class="form-group">
{!! Form::label('password', 'Enter New Password:') !!}
{!! Form::text('password', null, ['class'=>'form-control']) !!}
</div>
<div class="form-group">
{!! Form::label('password_confirmation', 'Confirm New Password:') !!}
{!! Form::text('password_confirmation', null, ['class'=>'form-control']) !!}
</div>
<div class="form-group">
{!! Form::submit('Change Password', ['class' => 'btn btn-primary form-control']) !!}
</div>
{!! Form::close() !!}
</div>
控制器:
public function updatePassword(UserSecurityFormRequest $request)
{
$user = Auth::user();
$current_password = $request->input('current_password');
$new_password = $request->input('password');
if (Hash::check($current_password, $user->password)) {
$user->fill([
'password' => Hash::make($request->newPassword)
])->save();
}
else{
return ('Please enter the correct password');
}
}
我还尝试在User ..
中设置密码属性public function setPasswordAttribute($password)
{
return $this->attributes['password'] = bcrypt($password);
}
没用。 (编辑:我之后删除了上述属性)如果有任何阻止注册表单(作为Laravel默认身份验证系统的一部分)创建登录表单识别的密码。
我已经检查过以确保表单提交了正确的详细信息。我通过在成功提交表单时从表单输入中转储所有数据来完成此操作。
用户模型:
<?php
命名空间App; 使用Carbon \ Carbon;
使用Illuminate \ Foundation \ Auth \ User作为Authenticatable; //使用App \ Http \ Controllers \ traits \ HasRoles;
类用户扩展Authenticatable {
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
//If register dont work or passwords arent being recognised then remove the following:
/* public function setPasswordAttribute($password)
{
return $this->attributes['password'] = bcrypt($password);
}*/
//turns dates to carbon
protected $dates = ['created_at'];
//Creates Many to Many Relationship between Users table (and model) and Roles Table (and model)
public function roles()
{
return $this->belongsToMany(Roles::class);
}
//Checks for a specific role
public function hasRole($role)
{
if(is_string($role))
{
return $this->roles->contains('name', $role);
}
return !! $role->intersect($this->roles)->count();
}
//gives the user the role
public function assignRole($role)
{
return $this->roles()->save(
Roles::whereName($role)->firstOrFail()
);
}
//Checks whether the user has a role with that permission
public function hasPermission($permission)
{
return $this->hasRole($permission->roles);
}
public function owns($related)
{
return $this->id === $related->user_id;
}
}
正如您所看到的,我已经注释掉了密码的属性设置器,因此不会影响密码。但它仍然无效。
任何帮助将不胜感激。
谢谢。
修改
它不起作用。非常感谢所有回复的人和@Steve Bauman允许我识别我的错误
工作职能: public function updatePassword(UserSecurityFormRequest $ request) {
$user = Auth::user();
$hashed_password = Auth::user()->password;
$current_password = $request->input('current_password');
$new_password = $request->input('password');
if (Hash::check($current_password, $hashed_password)) {
$user->fill([
'password' => Hash::make($request->password)
])->save();
}
else{
return ('Please enter the correct password');
}
}
答案 0 :(得分:2)
找到你的问题:
public function updatePassword(UserSecurityFormRequest $request)
{
$user = Auth::user();
$current_password = $request->input('current_password');
$new_password = $request->input('password');
if (Hash::check($current_password, $user->password)) {
$user->fill([
// This should be $request->password, not `$request->newPassword`
'password' => Hash::make($request->newPassword)
])->save();
} else {
return ('Please enter the correct password');
}
}
请求的变量newPassword
将为空,这就是您的密码无法正常工作的原因。您要查找的请求字段为password
。
这是由于您的表单字段使用password
作为输入名称。
答案 1 :(得分:0)
你进行双重密码哈希,首先在 Hash :: make($ request-&gt; newPassword)第二个setter bcrypt($ password)
删除一个,一切都应该没问题。
答案 2 :(得分:0)
尝试使用它:
bcrypt($request->newPassword);