教你修改 Laravel "记住我" Cookie 的过期时间. | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区

[教你修改 Laravel "记住我" Cookie 的过期时间. | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区]

本文适用的 Laravel 版本: 5.2 +

问题

有时候, 网站会提供一个选项, 让用户在7天内免登陆, 或者30天内免登陆, 但是 Laravel 的自带 Auth 模块没有提供选项让我们修改这个过期时间, 那么我们该如何实现这个需求呢?

查看源码

如果要使用 laravel 自带的 Auth 模块是非常简单的, 只要通过 make auth 即可安装.

但是, 在 laravel 的默认设置中, 如果用户勾选了 _Remember Me_, 那么 Laravel 就会永久保存这个用户的登录状态, 直到用户手动 Logout.

Laravel 文档中是这样描述的
[](https://lccdn.phphub.org/uploads/images/201706/21/7096/Pvsm61jSX7.png)

[file

](https://lccdn.phphub.org/uploads/images/201706/21/7096/Pvsm61jSX7.png)

在源码中, 也将相关的Cookie 过期时间设置为了 forever.
路径为: vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php
[](https://lccdn.phphub.org/uploads/images/201706/21/7096/gm9ERPaYX8.png)

[file

](https://lccdn.phphub.org/uploads/images/201706/21/7096/gm9ERPaYX8.png)

那么, 如何在不修改源码的情况下更改这一设置呢?

解决方法

在运行过 make auth 之后, 在 Controllers 文件夹中, 系统会帮我创建一个 Auth 文件夹, 这个文件夹里放置了一些登录用的 Controller, 我们只要对其中的 LoginController 做一些修改, 就可以实现我们的需求了.

基本思路是这样的, 在 Laravel 将 remember_token 的过期时间设置为 forever 之后, 这个时候还没有将 Cookie 发回到浏览器, 所以我们只要在发回浏览器之前, 再次修改这个 Cookie 的有效期即可.

在打开 LoginController 之后, 我们可以看到

    use AuthenticatesUsers;

也就是说 LoginController 使用了 AuthenticatesUsers trait 中的方法, 我们进入 AuthenticatesUsers 这个 trait. 很容易找到 sendLoginResponse 这个方法, 这个方法的作用是在成功验证用户信息后, 返回登录成功的消息给浏览器. 所以我们只要重写这个方法, 并且在这个方法里加入对 Cookie 有效期的修改操作即可实现我们的需求.

接下来, 我们就在 LoginController 中重写一次这个方法.

首先我们直接将 protected function sendLoginResponse(Request $request) 这个方法从 AuthenticatesUsers 复制到 LoginController 中, 然后再加入修改 Cookie 的代码即可. 修改后的 LoginController 会像下面这样

class LoginController extends Controller
{
    ...

    protected function sendLoginResponse(Request $request)
    {
        // 设置记住我的时间为60分钟
        $rememberTokenExpireMinutes = 60;

        // 首先获取 记住我 这个 Cookie 的名字, 这个名字一般是随机生成的,
        // 类似 remember_web_59ba36addc2b2f9401580f014c7f58ea4e30989d
        $rememberTokenName = Auth::getRecallerName();

        // 再次设置一次这个 Cookie 的过期时间
        Cookie::queue($rememberTokenName, Cookie::get($rememberTokenName), $rememberTokenExpireMinutes);

        // 下面的代码是从 AuthenticatesUsers 中的 sendLoginResponse() 直接复制而来
        $request->session()->regenerate();

        $this->clearLoginAttempts($request);

        return $this->authenticated($request, $this->guard()->user())
            ?: redirect()->intended($this->redirectPath());
    }
}

结束

好了, 现在你就可以在没有修改源代码的情况下, 自定义 "记住我" Cookie 的过期时间了.


Original url: Access

Created at: 2018-10-10 18:19:20

Category: default

Tags: none

请先后发表评论
  • 最新评论
  • 总共0条评论