Vấn đề

Đôi khi, trang web của bạn chỉ muốn người dùng sử chức năng remembering users trong 7 ngày hoặc là 30 ngày chẳng hạn. Nhưng Authentication của Laravel không cung cấp cho chúng ta tùy chọn để thay đổi thời gian hết hạn của remembering users. Vậy có cách nào để làm được điều này không?

Mã nguồn

Nếu bạn sử dụng Auth của Laravel thì rất đơn giản bạn có thể sử dụng lệnh command sau:

composer require laravel/ui

Tuy nhiên, trong cài đặt mặc định của laravel, nếu người dùng sử dụng chức năng remembering users, thì Laravel sẽ lưu trạng thái đăng nhập của người dùng vĩnh viễn hoặc đến khi người dùng đăng xuất.

Điều này được mô tả trong tài liệu Laravel.

Trong mã nguồn, thời hạn cookie cũng được đặt thành vĩnh viễn. Đường dẫn là vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php

/**
 * Create a "remember me" cookie for a given ID.
 *
 * @param  string  $value
 * @return \Symfony\Component\HttpFoundation\Cookie
 */
protected function createRecaller($value)
{
    return $this->getCookieJar()->forever($this->getRecallerName(), $value);
}

Vì vậy, làm thế nào để thay đổi điều này mà không cần thay đổi mã nguồn không?

Trong suy nghĩ của tôi bất ngờ có một ý tường táo bạo như sau:

Sau khi Laravel đặt thời gian hết hạn cookie của remembering users thành vĩnh viễn, thì thời điểm này cookie chưa được gửi lên trình duyệt. Vì vậy, chúng ta sẽ lợi dụng thời điểm này để thay đổi thời gian của cookie thêm một lần nữa trước khi gửi lên trình duyệt.

Còn chần chừ gì nữa, chúng ta hãy tiến hành thực hiện ý tưởng trên nào.

Đầu tiên, chúng ta cần chuẩn bị hàm thay đổi thời gian hết hạn của cookie:

protected function changeExpireCookieRemember()
{
    $rememberTokenExpireMinutes = 60 * 24 * 15;
    $rememberTokenName          = Auth::getRecallerName();
    $rememberCookie             = Auth::getCookieJar()->queued($rememberTokenName);
    if ($rememberCookie) {
        $cookieValue = $rememberCookie->getValue();
        \Cookie::queue($rememberTokenName, $cookieValue, $rememberTokenExpireMinutes);
    }
}

Sau đó, chúng ta sẽ thực hiện hàm trên ngay sau khi vừa thực hiện attempt trong hàm thực hiện login của bạn:

use Illuminate\Support\Facades\Auth;
class LoginController extends Controller
{
    ...
    protected function sendLoginResponse(Request $request)
    {
         $request->validate([
            'email'    => 'required|email',
            'password' => 'required',
        ]);
        $credentials = $request->only('email', 'password');
        $remember    = $request->remember ? true : false;
        if (Auth::attempt($credentials, $remember)) {
            $this->changeExpireCookieRemember();
            $request->session()->regenerate();
            return redirect()->intended('control-panel-v1');
        } 
        return back()->withErrors([
            'email' => 'The provided credentials do not match our records.',
        ]);
    }
}

 Kết luận

Bây giờ bạn có thể tùy chỉnh thời gian hết hạn của cookie remembering users mà không cần sửa đổi mã nguồn.

CÓ THỂ BẠN QUAN TÂM

Fast Paginate in Laravel

Fast Paginate in Laravel

Laravel Fast Paginate là gì? Laravel Fast Paginate là một macro nhanh về phân trang offset/limit cho Laravel. Nó được sử dụng để thay thể paginate trong Laravel.Package này sử dụng phương pháp SQL t...

Laravel Export & Import CSV

Laravel Export & Import CSV

Trong bài viết này, tôi sẽ hướng dẫn các tạo cách Export hoặc Import CSV trong Laravel. Nhưng thay vì chỉ viết hàm đơn thuần trong PHP thì tôi sẽ hướng dẫn các tạo ra một Service trong Laravel bằng cá...

Laravel UI Custom Email Password Reset Template

Laravel UI Custom Email Password Reset Template

Nếu bạn đang dùng thư viện laravel/ui để làm các chức năng liên quan đến authentication, và trong dự án của bạn, bạn cần thay đổi template email password reset thay vì sử dụng template email password...

Laravel TinyMCE 6 Image Upload

Laravel TinyMCE 6 Image Upload

TinyMCE TinyMCE là một trình soạn thảo  WYSIWYG  được xây dựng trên nền tảng Javascript, được phát triển dưới dạng mã nguồn mở theo giấy phép  MIT  bởi Tiny Technologies Inc. TinyMCE cho phép ngư...

Cloudflare's Turnstile CAPTCHA in Laravel

Cloudflare's Turnstile CAPTCHA in Laravel

Ngày 28/09/2022, Cloudflare đã thông báo về phiên bản beta mở của Turnstile, một giải pháp thay thế vô hình cho CAPTCHA. Bất kỳ ai, ở bất kỳ đâu trên Internet muốn thay thế CAPTCHA trên trang web c...

Laravel UI Custom Email Verification Template

Laravel UI Custom Email Verification Template

Nếu bạn đang dùng thư viện laravel/ui để làm các chức năng liên quan đến authentication, và trong dự án của bạn, bạn cần thay đổi template email verification thay vì sử dụng template email verificatio...

Eloquent Methods: whereDoesntHaveRelation and whereMorphDoesntHaveRelation

Eloquent Methods: whereDoesntHaveRelation and whereMorphDoesntHaveRelation

New Laravel 11.37: Eloquent Methods Laravel cung cấp cho chúng ta khả năng xây dựng các truy vấn dữ liệu mạnh mẽ với Eloquent ORM, giúp chúng ta có thể xử lý các truy vấn cơ sở dữ liệu phức tạp một...

Laravel User Authentication

Laravel User Authentication

Trong hướng dẫn này, tôi sẽ hướng dẫn bạn xây dựng chức năng đăng nhập trong Laravel. Công bằng mà nói thì bạn có thể sử dụng Laravel UI hoặc JetStream để tự động tạo ra chức năng đăng nhập trong Lara...

Laravel Task Scheduling

Laravel Task Scheduling

Trong các ứng dụng lớn, bạn cần lên lịch định kì cho các công việc bằng Cron jobs.  Tại số một số thời điểm, việc quản lý các cron jobs trở nên cồng kềnh và khó khăn hơn. Laravel Scheduler là một côn...

ManhDanBlogs