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

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

Generate PDF with Header and Footer on every page in Laravel

Generate PDF with Header and Footer on every page in Laravel

Hôm nay, trong bài viết này mình sẽ chia sẻ với các bạn cách dompdf mà header và footer sẽ được hiển thị ở tất cả các trang. Đây cũng là một vấn đề khá phổ biến, khi chúng ta phát triển các tính năng...

Laravel Has Many Through Eloquent Relationship

Laravel Has Many Through Eloquent Relationship

Has Many Through Relationship hơi phức tạp để hiểu một cách đơn giản, nó sẽ cung cấp cho chúng ta một con đường tắt để có thể truy cập dữ liệu của một quan hệ xa xôi thông qua một mối quan hệ trung gi...

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 Upload File Using Trait

Laravel Upload File Using Trait

Hiện nay, đa số các dự án đều có chức năng upload file, nên tôi đã thử xây dựng một lớp Trait Upload File, để chúng ta dễ dàng sao chép qua các dự án khác để sử dụng, nhằm rút ngắn thời gian phát triể...

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 Controllers

Laravel Controllers

Trong mô hình MVC, chữ "C" là từ viết tắt của Controller và nó đóng vai trò rất quan trọng để phân tích các logic business. Khi người dùng truy cập vào trình duyệt, nó sẽ đi đến route đầu tiên, sau đó...

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

Implementing Private User Folders with elFinder in Laravel

Implementing Private User Folders with elFinder in Laravel

elFinder elFinder là một trình quản lý tập tin mã nguồn mở dành cho web, được viết bằng JavaScript sử dụng jQuery UI. elFinder được phát triển dựa trên cảm hứng từ sự tiện lợi và đơn giản của chư...

ManhDanBlogs