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.