Skip to content

Đặ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

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-resets

Tự động xóa bằng Task Scheduling:

php
use Illuminate\Support\Facades\Schedule;

Schedule::command('auth:clear-resets')->everyFifteenMinutes();

Tùy chỉnh (Customization)

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