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

Document Laravel API With OpenAPI (Swagger)

Document Laravel API With OpenAPI (Swagger)

Swagger là gì? Swagger là một Ngôn ngữ mô tả giao diện để mô tả các API RESTful được thể hiện bằng JSON. Swagger được sử dụng cùng với một bộ công cụ phần mềm mã nguồn mở để thiết kế, xây dựng, l...

Laravel View

Laravel View

View là gì? Đây là phần giao diện (theme) dành cho người sử dụng. Nơi mà người dùng có thể lấy được thông tin dữ liệu của MVC thông qua các thao tác truy vấn như tìm kiếm hoặc sử dụng thông qua các...

Laravel Jobs Batching

Laravel Jobs Batching

Phiên bản Laravel 8 đã được phát hành với một tính năng mà rất nhiều người trong chúng ta đã chờ đợi rất lâu đó là Jobs Batching, nó cho phép chúng ta thực hiện nhiều công việc trong cùng một lúc và t...

Laravel Routing

Laravel Routing

Route là gì? Đúng như tên gọi của nó, Route thực hiện chức năng định tuyến, dẫn đường cho các HTTP request gửi đến đúng nơi mà ta mong muốn. Với sự phát triển mạnh mẽ của ứng dụng web ngày nay, việc...

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

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

Integrating OpenAI in Laravel

Integrating OpenAI in Laravel

OpenAI OpenAI là một phòng thí nghiệm nghiên cứu trí tuệ nhân tạo (AI) của Mỹ bao gồm tổ chức phi lợi nhuận OpenAI Incorporated (OpenAI Inc.) và công ty con hoạt động vì lợi nhuận OpenAI Limited Par...

Laravel CKEditor 5 Image Upload

Laravel CKEditor 5 Image Upload

CKEditor 5CKEditor 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...

Integrating CKEditor 5 in Laravel 10 using Vite

Integrating CKEditor 5 in Laravel 10 using Vite

CKEditor 5CKEditor 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...

ManhDanBlogs