Правило current_password
Правило current_password применяется для валидации полей формы,
в которые пользователь вводит свой текущий пароль. Это правило
гарантирует, что введённое значение совпадает с паролем
аутентифицированного пользователя в системе.
Правило полезно при реализации функционала смены пароля,
подтверждения критических действий или удаления аккаунта.
По умолчанию правило использует охранник (guard) по умолчанию,
но вы можете указать конкретный охранник через параметр.
Синтаксис
Правило можно использовать в массиве правил валидации как строку
или через класс Rule:
<?php
use Illuminate\Validation\Rule;
// Как строка
'current_password' => 'current_password'
// Через класс Rule
'current_password' => Rule::currentPassword()
// С указанием охранника
'current_password' => Rule::currentPassword('admin')
?>
Пример
Давайте создадим запрос на обновление пароля пользователя с проверкой текущего пароля:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
class UpdatePasswordRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
public function rules(): array
{
return [
'current_password' => ['required', 'current_password'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
];
}
}
?>
Теперь используем этот запрос в контроллере для смены пароля:
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Support\Facades\Hash;
use App\Http\Requests\UpdatePasswordRequest;
class UserController extends Controller
{
public function updatePassword(UpdatePasswordRequest $request)
{
$user = auth()->user();
$user->password = Hash::make($request->password);
$user->save();
return response()->json(['message' => 'Password updated successfully']);
}
}
?>
Пример
Валидация текущего пароля через фасад Validator
в контроллере без отдельного запроса:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
class ProfileController extends Controller
{
public function deleteAccount(Request $request)
{
$validator = Validator::make($request->all(), [
'current_password' => ['required', 'current_password'],
'confirm' => ['required', 'accepted'],
]);
if ($validator->fails()) {
return back()->withErrors($validator);
}
$request->user()->delete();
return redirect('/')->with('message', 'Account deleted');
}
}
?>
Пример
Использование правила current_password с указанием
конкретного охранника для административной панели:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
class AdminUpdatePasswordRequest extends FormRequest
{
public function authorize(): bool
{
return auth()->guard('admin')->check();
}
public function rules(): array
{
return [
'current_password' => ['required', Rule::currentPassword('admin')],
'new_password' => ['required', 'string', 'min:10', 'confirmed'],
];
}
}
?>
Пример
Отображение ошибок валидации для текущего пароля в Blade-шаблоне:
<form method="POST" action="{{ route('password.update') }}">
@csrf
<div>
<label for="current_password">Current password</label>
<input type="password" name="current_password" id="current_password">
@error('current_password')
<span>{{ $message }}</span>
@enderror
</div>
<div>
<label for="password">New password</label>
<input type="password" name="password" id="password">
@error('password')
<span>{{ $message }}</span>
@enderror
</div>
<div>
<label for="password_confirmation">Confirm password</label>
<input type="password" name="password_confirmation" id="password_confirmation">
</div>
<button type="submit">Update password</button>
</form>