目录
Laravel 8 自带 auth demo(一)>> 路由的定义_咖喱出品的博客-CSDN博客
Laravel 8 自带 auth demo(二)>> 注册与登录-解析_咖喱出品的博客-CSDN博客
Laravel 8 自带 auth demo(三)>> 记住密码和退出-解析_咖喱出品的博客-CSDN博客
Laravel 8 自带 auth demo(四)>> 忘记密码-解析_咖喱出品的博客-CSDN博客
登录时 Remember Me 的解析
可以看到在登录页面有一个 Remember Me 的功能,如果勾选会有什么效果呢,如下图:

首先了解一下正常登录不使用 Remember Me 选项登录时的流程,当用户登录后,Laravel 会在用户的浏览器中创建一个会话 cookie,Laravel 会在服务器端创建一个会话(session),并将会话 ID 存储在用户的浏览器中的 cookie 中。每次用户发送请求时,浏览器都会将该 cookie 发送到服务器端,Laravel 会根据该会话 ID 来判断用户是否已经登录,直到这个 session 达到设定的过期时间,下次再访问网站时需要重新登录。
设置 session 过期时间的配置文件有两个,一个是laravel 项目目录下的 .env 文件,里面的配置如下:
SESSION_LIFETIME=120
另一个是 laravel 项目目录下的 \config\session.php 文件(.env 生效的优先级要大于 session.php),里面的配置如下:
# 该配置表示用户 会话(session)的有效期,以分钟为单位,默认值为 120 分钟
'lifetime' => env('SESSION_LIFETIME', 120),
# 该配置表示 会话(session)是否在浏览器关闭时自动过期
# 设置为 true,则会话将在用户关闭浏览器时自动过期,否则会话将在指定的过期时间内过期
'expire_on_close' => false,
注:
如果将 expire_on_close 设置为 false,则会话的过期时间由 lifetime 选项来控制,即会话将在 lifetime 时间内没有任何活动时过期。这意味着,即使用户关闭了浏览器,只要在 lifetime 时间内重新打开浏览器并访问网站,会话仍然处于活动状态。相反,如果将 expire_on_close 设置为 true,则会话将在用户关闭浏览器时立即过期。这意味着,用户重新打开浏览器并访问网站时,会话将被视为已过期,用户需要重新登录。需要注意的是,expire_on_close 只是控制会话在浏览器关闭时是否自动过期,并不影响 "Remember Me" 功能。无论 expire_on_close 如何设置,如果用户勾选了 "Remember Me" 选项,将会在用户的浏览器中创建一个持久性的 cookie,该 cookie 的过期时间通常比会话的有效期长得多
当用户使用 Remember Me 选项登录时,Laravel 会在用户的浏览器中创建一个持久性的 cookie,该 cookie 包含了一个 token 和一个过期时间。这意味着,即使用户关闭浏览器或者电脑,下次再访问网站时也不需要重新登录。token 保存在 users 表里,如下图:

注:
在 Laravel 中,"Remember Me" 功能是通过在用户登录时创建一个记住用户的 cookie 来实现的。这个 cookie 包含了一个 token 和一个过期时间,token 会被存储在 users 数据表中的remember_token 字段中。当用户勾选了 "Remember Me" 并提交登录表单时,Laravel 会调用 Auth::attempt() 方法,该方法会生成一个新的 token,并将其存储在用户的 remember_token 字段中。同时,Laravel 会将该 token 和过期时间存储在用户的 cookie 中,并将 cookie 发送给客户端浏览器。当用户下次访问网站时,浏览器会将上次登录时的 cookie 发送给服务器。Laravel 会验证该 cookie 中的 token 是否与用户在数据库中存储的 token 相匹配,如果匹配则自动登录该用户。如果 token 已经过期,则 Laravel 会要求用户重新登录。需要注意的是,为了保证安全性,Laravel 会对 token 进行加密和解密操作。这样可以防止攻击者伪造 token 并访问受保护的页面。
在 laravel 的官方文档中 并没有提及 remember_token 有过期时间,只有手动登出才会停止,如下图:

但是永远可以免登录的话肯定不现实,这里提供一个方法,通过在 LoginController 里复写 AuthenticatesUsers 这个 trait 里的 sendLoginResponse() 方法,来实现设定 Remember Me 功能的时效性,如下图:
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());
}
}
登出功能解析
在 home 页面的右上角点击退出即可登出,如下图:

找到 home 的视图文件并查看登出行为定义的路由指向,文件的路径\resources\views\layouts\app.blade.php,如下图:

去 auth() 方法里找到对应的路由配置,如下图:

指向的函数为 AuthenticatesUsers 里的 logout(),如下图:

退出完成,返回初始页面,初始页面在 \routes\web.php 配置了路由,如下:

本文详细解析了Laravel 8自带auth中的记住密码(Remember Me)功能,包括其工作原理、配置以及如何设置过期时间。同时,介绍了登出功能的实现过程,包括路由和控制器的方法。
1023

被折叠的 条评论
为什么被折叠?



