Giao diện
Đặt lại mật khẩu (Resetting Passwords)
Giới thiệu (Introduction)
Hầu hết ứng dụng web cung cấp cách để reset mật khẩu đã quên. Laravel cung cấp services tiện lợi để gửi password reset links và reset passwords an toàn.
BẮT ĐẦU NHANH
Cài đặt Laravel Starter Kits — scaffold authentication system hoàn chỉnh, bao gồm resetting forgotten passwords.
Cấu hình (Configuration)
File cấu hình config/auth.php chứa section passwords cấu hình password reset behavior.
Model Preparation
Model User phải sử dụng trait Illuminate\Notifications\Notifiable (đã bao gồm sẵn).
Routing
Yêu cầu Password Reset Link
Form
php
Route::get('/forgot-password', function () {
return view('auth.forgot-password');
})->middleware('guest')->name('password.request');Xử lý Form Submission
php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Password;
Route::post('/forgot-password', function (Request $request) {
$request->validate(['email' => 'required|email']);
$status = Password::sendResetLink(
$request->only('email')
);
return $status === Password::ResetLinkSent
? back()->with(['status' => __($status)])
: back()->withErrors(['email' => __($status)]);
})->middleware('guest')->name('password.email');Password::sendResetLink gửi email với reset link qua notification system.
Reset Password
Form hiển thị
php
Route::get('/reset-password/{token}', function (string $token) {
return view('auth.reset-password', ['token' => $token]);
})->middleware('guest')->name('password.reset');Xử lý Reset
php
use App\Models\User;
use Illuminate\Auth\Events\PasswordReset;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Password;
use Illuminate\Support\Str;
Route::post('/reset-password', function (Request $request) {
$request->validate([
'token' => 'required',
'email' => 'required|email',
'password' => 'required|min:8|confirmed',
]);
$status = Password::reset(
$request->only('email', 'password', 'password_confirmation', 'token'),
function (User $user, string $password) {
$user->forceFill([
'password' => Hash::make($password),
])->setRememberToken(Str::random(60));
$user->save();
event(new PasswordReset($user));
}
);
return $status === Password::PasswordReset
? redirect()->route('login')->with('status', __($status))
: back()->withErrors(['email' => [__($status)]]);
})->middleware('guest')->name('password.update');Xóa Tokens hết hạn (Deleting Expired Tokens)
bash
php artisan auth:clear-resetsTự động xóa bằng Task Scheduling:
php
use Illuminate\Support\Facades\Schedule;
Schedule::command('auth:clear-resets')->everyFifteenMinutes();Tùy chỉnh (Customization)
Reset Link URL
Tùy chỉnh URL của reset link trong notification:
php
use Illuminate\Auth\Notifications\ResetPassword;
ResetPassword::createUrlUsing(function (User $user, string $token) {
return 'https://example.com/reset-password?token=' . $token;
});Tùy chỉnh Email
php
use Illuminate\Auth\Notifications\ResetPassword;
use Illuminate\Notifications\Messages\MailMessage;
ResetPassword::toMailUsing(function (User $user, string $token) {
$url = url(route('password.reset', ['token' => $token, 'email' => $user->email], false));
return (new MailMessage)
->subject('Đặt lại mật khẩu')
->line('Bạn nhận được email này vì chúng tôi nhận được yêu cầu reset mật khẩu.')
->action('Đặt lại mật khẩu', $url)
->line('Nếu bạn không yêu cầu, vui lòng bỏ qua email này.');
});