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

Integrating Google Gemini AI in Laravel

Integrating Google Gemini AI in Laravel

Google Gemini Gemini là một mô hình trí tuệ nhân tạo mới mạnh mẽ từ Google không chỉ có khả năng hiểu văn bản mà còn có thể hiểu cả hình ảnh, video và âm thanh. Gemini là một mô hình đa phương ti...

Laravel Validate Video Duration

Laravel Validate Video Duration

Đôi khi trong dự án, chúng ta cần xác định thời lượng video được phép upload lên server. Nhưng rất tiếc, Laravel không cung cấp validate xác định thời lượng video để chúng ta thực hiện được. Vì vậy, t...

Laravel Model

Laravel Model

Model là gì? Trong mô hình MVC, chữ “M” viết tắt là Model, Model dùng để xử lý logic nghiệp vụ trong bất kì ứng dụng dựa trên mô hình MVC. Trong Laravel, Model là lớp đại diện cho cấu trúc logic và...

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ư...

Encrypted HTTP Live Streaming with Laravel FFMpeg

Encrypted HTTP Live Streaming with Laravel FFMpeg

HTTP Live Streaming (HLS)  HTTP Live Streaming (HLS) là một trong những giao thức phát trực tuyến video được sử dụng rộng rãi nhất . Mặc dù nó được gọi là HTTP "live" streaming, nhưng nó được sử dụn...

Laravel customize your API Versioning Route File

Laravel customize your API Versioning Route File

Trong khuôn khổ của Laravel, các route của api được tách thành một file duy nhất, đó là file api.php nằm trong thư mục routes . Nếu chúng ta muốn thêm version vào route api thì chúng ta sẽ làm như...

Integrating CKFinder into CKEditor 5 in Laravel 11

Integrating CKFinder into CKEditor 5 in Laravel 11

CKEditor 5 CKEditor 5 là một trình soạn thảo văn bản phong phú JavaScript với nhiều tính năng và khả năng tùy chỉnh. CKEditor 5 có kiến trúc MVC hiện đại, mô hình dữ liệu tùy chỉnh và DOM ảo, mang...

Efficient Laravel PDF Export for Large Datasets

Efficient Laravel PDF Export for Large Datasets

Xuất file PDF là một tính năng quan trọng của nhiều ứng dụng web, đặc biệt là các trang thương mại điện tử, giúp người dùng tạo và lưu trữ các bản báo cáo, hóa đơn, v.v.  Tuy nhiên, khi phải xử lý...

Laravel Socialite Login With Linkedin

Laravel Socialite Login With Linkedin

LinkedIn LinkedIn là mạng xã hội tập trung vào mạng lưới nghề nghiệp và phát triển nghề nghiệp và chuyên nghiệp lớn nhất thế giới trên internet. Bạn có thể sử dụng LinkedIn để tìm công việc hoặc...

ManhDanBlogs