Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Menguasai Penyesuaian Tetapan Semula Kata Laluan Laravel: Panduan Komprehensif

Menguasai Penyesuaian Tetapan Semula Kata Laluan Laravel: Panduan Komprehensif

WBOY
WBOYasal
2024-09-01 06:31:39335semak imbas

Mastering Laravel Password Reset Customization: A Comprehensive Guide

pengenalan

Fungsi tetapan semula kata laluan ialah komponen penting bagi mana-mana aplikasi web moden. Walaupun Laravel menyediakan penyelesaian luar biasa yang teguh, ada kalanya anda perlu menyesuaikan proses ini untuk memenuhi keperluan khusus atau meningkatkan pengalaman pengguna. Dalam tutorial ini, kami akan menyelam lebih mendalam ke dalam menyesuaikan aliran kerja tetapan semula kata laluan Laravel, merangkumi segala-galanya daripada pengubahsuaian asas kepada teknik lanjutan.

Sejarah Ringkas Pengesahan Laravel

Sebelum kita mendalami penyesuaian, mari kita lakukan perjalanan pantas ke lorong ingatan untuk memahami bagaimana penyelesaian pengesahan Laravel telah berkembang:

  1. UI Laravel: Lelaran pertama bagi penyelesaian pengesahan lengkap dalam Laravel, yang berkhidmat dengan baik kepada komuniti selama bertahun-tahun.
  2. Laravel Breeze: Dilahirkan daripada populariti CSS Tailwind yang semakin meningkat, Breeze menawarkan perancah pengesahan yang minimum, ringan dan moden.
  3. Laravel Jetstream: Bagi mereka yang memerlukan ciri yang lebih maju, Jetstream telah diperkenalkan, meliputi pelbagai jenis pengesahan termasuk 2FA dan fungsi pengurusan pasukan.
  4. Laravel Fortify: Bahagian belakang pengesahan tanpa kepala yang boleh digunakan dengan mana-mana bahagian hadapan, memberikan fleksibiliti kepada pembangun untuk melaksanakan UI mereka sendiri.

Memahami Aliran Tetapan Semula Kata Laluan Laravel

Proses tetapan semula kata laluan Laravel biasanya melibatkan langkah berikut:

  1. Pengguna meminta tetapan semula kata laluan
  2. Token dijana dan disimpan
  3. E-mel dihantar kepada pengguna dengan pautan tetapan semula (URL yang ditandatangani)
  4. Pengguna mengklik pautan dan memasukkan kata laluan baharu
  5. Kata laluan dikemas kini dan token tidak sah

Walaupun aliran ini berfungsi dengan baik untuk kebanyakan aplikasi, anda mungkin mahu menyesuaikan pelbagai aspek proses ini agar lebih sesuai dengan keperluan anda.

Apa yang Kami Bina

Dalam tutorial ini, kami akan mencipta aplikasi Laravel SaaS (minimum) kosong dengan aliran tetapan semula kata laluan tersuai. Kami akan meliputi:

  • Menyediakan aplikasi Laravel baharu dengan Breeze
  • Menyesuaikan URL tetapan semula kata laluan
  • Mengubah suai kandungan e-mel tetapan semula kata laluan
  • Menambahkan pemberitahuan kejayaan selepas penetapan semula kata laluan
  • Melaksanakan dan menyesuaikan ujian automatik untuk perubahan kami

Bermula

Mari kita mulakan dengan menyediakan aplikasi Laravel baharu:

composer create-project laravel/laravel password-reset-demo
cd password-reset-demo

Sebelum kita meneruskan, mari kita mulakan Git untuk kawalan versi:

git init
git add .
git commit -m "Initial commit"

Sekarang, mari pasang Laravel Breeze untuk mendapatkan perancah pengesahan asas:

composer require laravel/breeze --dev
php artisan breeze:install

Apabila digesa, pilih tindanan yang paling sesuai dengan keperluan anda. Untuk tutorial ini, kami akan menggunakan Livewire:

php artisan breeze:install

  Which Breeze stack would you like to install?
❯ livewire

  Would you like dark mode support? (yes/no) [no]
❯ no

  Which testing framework do you prefer? [PHPUnit]
❯ Pest

Selepas pemasangan, mari lakukan perubahan kami:

git add .
git commit -m "Add Authentication and Pages"

Sekarang, sediakan pangkalan data anda dan jalankan migrasi:

php artisan migrate

Pasang dan susun aset bahagian hadapan anda:

npm install
npm run dev

Pada ketika ini, kami mempunyai aplikasi Laravel asas dengan fungsi pengesahan. Mari jalankan ujian untuk memastikan semuanya berfungsi seperti yang diharapkan:

php artisan test

Anda sepatutnya melihat semua ujian lulus, memberi kami lampu hijau untuk meneruskan penyesuaian kami.

Menyesuaikan URL Tetapan Semula Kata Laluan

Secara lalai, Laravel (menggunakan Breeze) menggunakan URL standard untuk tetapan semula kata laluan (/reset-password). Mari sesuaikan ini dalam AppServiceProvider kami:

<?php

namespace App\Providers;

use App\Models\User;
use Illuminate\Auth\Notifications\ResetPassword;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        ResetPassword::createUrlUsing(function (User $user, string $token) {
            return url(route('password.reset', [
                'token' => $token,
                'email' => $user->getEmailForPasswordReset(),
            ], false));
        });
    }
}

Penyesuaian ini membolehkan anda mengubah suai struktur URL tetapan semula, menambah parameter tambahan atau malah menunjuk ke domain yang berbeza sama sekali jika perlu. Contohnya, anda boleh menukarnya kepada:

return "https://account.yourdomain.com/reset-password?token={$token}&email={$user->getEmailForPasswordReset()}";

Mengubah suai E-mel Tetapan Semula Kata Laluan

Seterusnya, mari sesuaikan kandungan e-mel tetapan semula kata laluan. Kami akan melakukan ini dengan menambah pada AppServiceProvider kami:

use Illuminate\Notifications\Messages\MailMessage;

// ...

public function boot(): void
{
    // ... previous customizations

    ResetPassword::toMailUsing(function (User $user, string $token) {
        $url = url(route('password.reset', [
            'token' => $token,
            'email' => $user->getEmailForPasswordReset(),
        ], false));

        return (new MailMessage)
            ->subject(config('app.name') . ': ' . __('Reset Password Request'))
            ->greeting(__('Hello!'))
            ->line(__('You are receiving this email because we received a password reset request for your account.'))
            ->action(__('Reset Password'), $url)
            ->line(__('This password reset link will expire in :count minutes.', ['count' => config('auth.passwords.' . config('auth.defaults.passwords') . '.expire')]))
            ->line(__('If you did not request a password reset, no further action is required.'))
            ->salutation(__('Regards,') . "\n" . config('app.name') . " Team");
    });
}

Nota: Fungsi __() ialah pembantu untuk penyetempatan, membolehkan terjemahan mudah rentetan dalam aplikasi anda.

Menambah Pemberitahuan Kejayaan Tetapan Semula Kata Laluan

Untuk meningkatkan pengalaman dan keselamatan pengguna, mari tambahkan pemberitahuan yang dihantar selepas penetapan semula kata laluan berjaya. Mula-mula, buat pemberitahuan baharu:

php artisan make:notification PasswordResetSuccessfullyNotification

Edit pemberitahuan yang baru dibuat:

<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;

class PasswordResetSuccessfullyNotification extends Notification implements ShouldQueue
{
    use Queueable;

    public function via($notifiable)
    {
        return ['mail'];
    }

    public function toMail($notifiable)
    {
        return (new MailMessage)
            ->subject('Password Reset Successful')
            ->greeting('Hello!')
            ->line('Your password has been successfully reset.')
            ->line('If you did not reset your password, please contact support immediately.')
            ->action('Login to Your Account', url('/login'))
            ->line('Thank you for using our application!');
    }
}

Sekarang, buat pendengar untuk acara PasswordReset:

php artisan make:listener SendPasswordResetSuccessfullyNotification --event=PasswordReset

Kemas kini pendengar:

<?php

namespace App\Listeners;

use App\Notifications\PasswordResetSuccessfullyNotification;
use Illuminate\Auth\Events\PasswordReset;
use Illuminate\Contracts\Queue\ShouldQueue;

class SendPasswordResetSuccessfullyNotification implements ShouldQueue
{
    public function handle(PasswordReset $event)
    {
        $event->user->notify(new PasswordResetSuccessfullyNotification());
    }
}

Ingat untuk mendaftarkan pendengar ini dalam EventServiceProvider anda.

Menguji Penyesuaian Kami

Ujian adalah penting untuk memastikan penyesuaian kami berfungsi seperti yang diharapkan. Kemas kini ujian tetapan semula kata laluan sedia ada dalam ujian/Feature/Auth/PasswordResetTest.php:

<?php

namespace Tests\Feature\Auth;

use App\Models\User;
use App\Notifications\PasswordResetSuccessfullyNotification;
use Illuminate\Auth\Notifications\ResetPassword;
use Illuminate\Support\Facades\Notification;
use Tests\TestCase;

class PasswordResetTest extends TestCase
{
    public function test_reset_password_link_can_be_requested(): void
    {
        Notification::fake();

        $user = User::factory()->create();

        $this->post('/forgot-password', ['email' => $user->email]);

        Notification::assertSentTo($user, ResetPassword::class, function ($notification) use ($user) {
            $response = $this->get($notification->toMail($user)->actionUrl);
            $this->assertStringContainsString('Reset Password', $response->getContent());
            return true;
        });
    }

    public function test_password_can_be_reset_with_valid_token(): void
    {
        Notification::fake();

        $user = User::factory()->create();

        $this->post('/forgot-password', ['email' => $user->email]);

        Notification::assertSentTo($user, ResetPassword::class, function ($notification) use ($user) {
            $token = $notification->token;

            $response = $this->post('/reset-password', [
                'token' => $token,
                'email' => $user->email,
                'password' => 'new-password',
                'password_confirmation' => 'new-password',
            ]);

            $response->assertSessionHasNoErrors();

            Notification::assertSentTo($user, PasswordResetSuccessfullyNotification::class);

            return true;
        });
    }

    public function test_reset_password_email_contains_custom_content(): void
    {
        Notification::fake();

        $user = User::factory()->create();

        $this->post('/forgot-password', ['email' => $user->email]);

        Notification::assertSentTo($user, ResetPassword::class, function ($notification) use ($user) {
            $mailMessage = $notification->toMail($user);
            $this->assertStringContainsString('Hello!', $mailMessage->greeting);
            $this->assertStringContainsString('Regards,', $mailMessage->salutation);
            return true;
        });
    }
}

Conclusion

Customizing Laravel's password reset workflow allows you to create a more tailored and user-friendly experience for your application. We've covered how to modify the reset URL, customize the email content, add a success notification, and ensure everything works through automated testing.

Remember, while customization can be powerful, it's essential to maintain security best practices throughout the process. Always validate user input, use secure token generation and storage methods, and follow Laravel's security recommendations.

Some additional considerations for further improvements:

  1. Implement rate limiting on password reset requests to prevent abuse.
  2. Add logging for successful and failed password reset attempts for security auditing.
  3. Consider implementing multi-channel notifications (e.g., SMS, push notifications) for critical security events like password resets.
  4. Regularly review and update your password policies to align with current security best practices.

For more advanced topics and Laravel insights, check out the official Laravel documentation and stay tuned to the Laravel community resources for more in-depth tutorials and best practices.

Happy coding, and may your Laravel applications be ever secure and user-friendly!

Atas ialah kandungan terperinci Menguasai Penyesuaian Tetapan Semula Kata Laluan Laravel: Panduan Komprehensif. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn