Laravel 7.x 如何让用户自行修改密码?
How to let users change their own passwords in Laravel 7.x?
有 关于如何允许用户更改他们的密码,但其中许多是针对旧版本的 Laravel。 2020年Laravelv7.x的正确方法是什么?
首先,让我们为用户创建一个表单。
关于此表格的几点说明:
- 我已使表格尽可能简单以使其易于阅读 - CSRF 令牌由 Form::open
自动创建
您应该仅使用'password'作为密码管理器应自动填充的字段名称。一些答案建议使用 'password' 作为新的密码字段名称,这会产生非常糟糕的用户体验
{{Form::open(array('url' => '/account/change-password'))}}
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<div class="form-group">
<div class="row">
<div class="col">
<label for="password" class="control-label">Current Password</label>
</div>
<div class="col">
{{Form::password('password', array('id' => 'password', 'class' => 'form-control', 'placeholder' => 'Password'))}}
</div>
</div>
</div>
<div class="form-group">
<div class="row">
<div class="col">
<label for="new-password" class="control-label">New Password</label>
</div>
<div class="col">
{{Form::password('new-password', array('id' => 'new-password', 'class' => 'form-control', 'placeholder' => 'New Password'))}}
</div>
</div>
</div>
<div class="form-group">
<div class="row">
<div class="col">
<label for="new-password-confirmation" class="control-label">Re-enter
Password</label>
</div>
<div class="col">
{{Form::password('new-password-confirmation', array('id' => 'new-password-confirmation', 'class' => 'form-control', 'placeholder' => 'Confirm Password'))}}
</div>
</div>
</div>
<div class="form-group">
<button type="submit" class="btn btn-danger">Change Password</button>
</div>
{{Form::close()}}
现在在你要处理请求的控制器中,让我们更改密码。
关于此的几点注意事项:
- 我们确认密码不是常用密码 - 此处使用的列表并不详尽(并且全部小写),我建议您使用 the common passwords 更新它,使其等于或大于您的最小长度
- 说到最小长度,8 个字符应该是这个时代的起点
- 最后,不要验证密码确认的长度 - 它只会给你两个错误(因为它已经完成)
- 最后,这不会审核密码更改。使用 Laravel Auditing 之类的东西,甚至只是发送电子邮件。
Account.php
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
/**
* Change users password
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse
*/
public function changePassword(Request $request)
{
if(Auth::Check())
{
$requestData = $request->All();
$validator = $this->validatePasswords($requestData);
if($validator->fails())
{
return back()->withErrors($validator->getMessageBag());
}
else
{
$currentPassword = Auth::User()->password;
if(Hash::check($requestData['password'], $currentPassword))
{
$userId = Auth::User()->id;
$user = User::find($userId);
$user->password = Hash::make($requestData['new-password']);;
$user->save();
return back()->with('message', 'Your password has been updated successfully.');
}
else
{
return back()->withErrors(['Sorry, your current password was not recognised. Please try again.']);
}
}
}
else
{
// Auth check failed - redirect to domain root
return redirect()->to('/');
}
}
/**
* Validate password entry
*
* @param array $data
* @return \Illuminate\Contracts\Validation\Validator
*/
public function validatePasswords(array $data)
{
$messages = [
'password.required' => 'Please enter your current password',
'new-password.required' => 'Please enter a new password',
'new-password-confirmation.not_in' => 'Sorry, common passwords are not allowed. Please try a different new password.'
];
$validator = Validator::make($data, [
'password' => 'required',
'new-password' => ['required', 'same:new-password', 'min:8', Rule::notIn($this->bannedPasswords())],
'new-password-confirmation' => 'required|same:new-password',
], $messages);
return $validator;
}
/**
* Get an array of all common passwords which we don't allow
*
* @return array
*/
public function bannedPasswords(){
return [
'password', '12345678', '123456789', 'baseball', 'football', 'jennifer', 'iloveyou', '11111111', '222222222', '33333333', 'qwerty123'
];
}
有
首先,让我们为用户创建一个表单。
关于此表格的几点说明:
- 我已使表格尽可能简单以使其易于阅读 - CSRF 令牌由 Form::open 自动创建
您应该仅使用'password'作为密码管理器应自动填充的字段名称。一些答案建议使用 'password' 作为新的密码字段名称,这会产生非常糟糕的用户体验
{{Form::open(array('url' => '/account/change-password'))}} <input type="hidden" name="_token" value="{{ csrf_token() }}"> <div class="form-group"> <div class="row"> <div class="col"> <label for="password" class="control-label">Current Password</label> </div> <div class="col"> {{Form::password('password', array('id' => 'password', 'class' => 'form-control', 'placeholder' => 'Password'))}} </div> </div> </div> <div class="form-group"> <div class="row"> <div class="col"> <label for="new-password" class="control-label">New Password</label> </div> <div class="col"> {{Form::password('new-password', array('id' => 'new-password', 'class' => 'form-control', 'placeholder' => 'New Password'))}} </div> </div> </div> <div class="form-group"> <div class="row"> <div class="col"> <label for="new-password-confirmation" class="control-label">Re-enter Password</label> </div> <div class="col"> {{Form::password('new-password-confirmation', array('id' => 'new-password-confirmation', 'class' => 'form-control', 'placeholder' => 'Confirm Password'))}} </div> </div> </div> <div class="form-group"> <button type="submit" class="btn btn-danger">Change Password</button> </div> {{Form::close()}}
现在在你要处理请求的控制器中,让我们更改密码。
关于此的几点注意事项:
- 我们确认密码不是常用密码 - 此处使用的列表并不详尽(并且全部小写),我建议您使用 the common passwords 更新它,使其等于或大于您的最小长度
- 说到最小长度,8 个字符应该是这个时代的起点
- 最后,不要验证密码确认的长度 - 它只会给你两个错误(因为它已经完成)
- 最后,这不会审核密码更改。使用 Laravel Auditing 之类的东西,甚至只是发送电子邮件。
Account.php
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
/**
* Change users password
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse
*/
public function changePassword(Request $request)
{
if(Auth::Check())
{
$requestData = $request->All();
$validator = $this->validatePasswords($requestData);
if($validator->fails())
{
return back()->withErrors($validator->getMessageBag());
}
else
{
$currentPassword = Auth::User()->password;
if(Hash::check($requestData['password'], $currentPassword))
{
$userId = Auth::User()->id;
$user = User::find($userId);
$user->password = Hash::make($requestData['new-password']);;
$user->save();
return back()->with('message', 'Your password has been updated successfully.');
}
else
{
return back()->withErrors(['Sorry, your current password was not recognised. Please try again.']);
}
}
}
else
{
// Auth check failed - redirect to domain root
return redirect()->to('/');
}
}
/**
* Validate password entry
*
* @param array $data
* @return \Illuminate\Contracts\Validation\Validator
*/
public function validatePasswords(array $data)
{
$messages = [
'password.required' => 'Please enter your current password',
'new-password.required' => 'Please enter a new password',
'new-password-confirmation.not_in' => 'Sorry, common passwords are not allowed. Please try a different new password.'
];
$validator = Validator::make($data, [
'password' => 'required',
'new-password' => ['required', 'same:new-password', 'min:8', Rule::notIn($this->bannedPasswords())],
'new-password-confirmation' => 'required|same:new-password',
], $messages);
return $validator;
}
/**
* Get an array of all common passwords which we don't allow
*
* @return array
*/
public function bannedPasswords(){
return [
'password', '12345678', '123456789', 'baseball', 'football', 'jennifer', 'iloveyou', '11111111', '222222222', '33333333', 'qwerty123'
];
}