【问题标题】:How to run custom code after authentication in Laravel Fortify?如何在 Laravel Fortify 中进行身份验证后运行自定义代码?
【发布时间】:2021-07-10 13:42:21
【问题描述】:

我正在使用 Laravel 8 和 Fortify。我网站上的用户可以在登录之前执行创建数据库记录的操作,这些记录由他们的会话 ID 关联。一旦他们登录或注册,我需要按会话 ID 查找记录并分配他们的用户 ID。

作为 Laravel 的新手,我不知道(也找不到与 Fortify 相关的任何其他相关问题)在哪里放置代码来执行此操作。请有人能指出我正确的方向吗?

【问题讨论】:

  • 到目前为止你做了什么?
  • 我已经安装了 Fortify,并且注册和登录过程正常

标签: laravel laravel-8 laravel-fortify


【解决方案1】:
  1. 使用内置的 Laravel 身份验证事件

您可以使用内置的laravel authentication events,并挂上登录或注册一个来做自己的事。所以你需要:

  • Illuminate\Auth\Events\RegisteredIlluminate\Auth\Events\Login 事件创建new Event listener。该听众将处理您的海关业务。 Login 事件已经将用户设置为参数,因此它将在您的侦听器中可用。
  • 编辑您的EventServiceProvider 以根据documentation 添加新的侦听器配置
  • 然后您需要您的会话 ID。如果您无法轻松覆盖默认登录事件以添加自定义参数,则可能需要为您的侦听器创建自己的事件。因为不建议使用来自事件监听器的 Session 或 Request 助手(请参阅下面的注释)(经过一些研究后编辑的行)
  • 运行composer dump-autoload && PHP artisan clear-compiled

2 - 与 Fortify 一起使用

根据documentation,您可以使用Fortify::authenticateUsing 方法覆盖登录过程。你也可以“挂钩”到registration process

从这里你可以做什么:

  • 保持authenticateUsing 或注册进程不变(或复制默认行为,因为您不需要更改 Fortify 提供的身份验证进程)
  • 添加到您想要的(登录成功或注册成功),一个新的Laravel event,只有在成功登录和/或成功注册时才会触发
  • 然后您可以处理来自事件侦听器的自定义查询。你的事件可以从Fortify::authenticateUsing,或request(),或Session helpers中的$request参数接收到对应的用户,以及session参数。

注意:您可能需要将完整的会话 ID 作为事件参数发送,以使其在您的侦听器中可用。

如果您使用排队事件,并且您的驱动程序不是 sync。因此,您有另一台服务器在侦听并执行您排队的作业/事件,或者 CRON,或主管。在这些情况下,“任务服务器”或“侦听器”上的 Laravel 会话助手可能无法按预期工作。因为它是另一个运行侦听器业务的 PHP 进程,而不是来自用户的。

因此处理用户请求的“前端”服务器必须将所有需要的数据添加到已调度的事件中(内置Login事件已经有用户作为参数),“任务服务器”无法从数据库中获取(可以从数据库中检索用户(请参阅有关 Event parameters injectionSerialized model 的文档),会话参数不能,因为它们是“用户会话”特定的)。

我不知道你是否能够覆盖登录事件来添加你的会话参数,但我认为用谷歌搜索 Laravel 登录自定义事件会很容易。 如果您不排队作业,则不需要这些,因此它们由相同的 PHP 进程和服务器同步执行。

【讨论】:

  • 感谢您的帮助。我最终沿着事件侦听器路线走下去,结果证明这很简单。事实上,我只需要为 Login 事件创建一个侦听器,因为这也会在成功注册时调用。
  • 没错。你有没有想过如何将你需要的会话参数发送给你的监听器?
  • 由于监听器没有排队,我可以访问会话。然而,我注意到的是会话 ID(使用 Session::getId() 检索)在用户出于某种原因登录后发生了变化。我通过在存储数据预身份验证时生成一个唯一 ID 并使用它来链接身份验证后记录来解决这个问题。
  • 太好了,很高兴你解决了。如果有一天您开始使用排队事件,请记得更新。
  • 小心:你不应该编辑供应商文件,因为你的编辑将在下次作曲家安装或更新时被删除。您确定即使登录时更改了 session_id,存储在 session 中的数据也会丢失吗?如果不是,您可以在会话中存储一些内容以供以后匹配。或者您也可以使用用户将在每次请求时发回的 Cookie。
猜你喜欢
  • 2021-01-12
  • 2019-09-05
  • 2017-07-27
  • 2020-04-24
  • 2021-01-07
  • 1970-01-01
  • 2016-12-06
  • 1970-01-01
  • 2016-06-29
相关资源
最近更新 更多