在 Laravel 中允许多个密码重置令牌

2023-12-19

Laravel (5.7) 密码重置系统的默认行为是在password_resets删除该用户的任何其他表后。这种行为是由\Illuminate\Auth\Passwords\DatabaseTokenRepository而且它似乎不可配置。

protected function deleteExisting(CanResetPasswordContract $user)
{
    return $this->getTable()->where('email', $user->getEmailForPasswordReset())->delete();
}

正在进行如此多的继承,我无法弄清楚要扩展哪些类,以便我可以插入自己的规则。

是否可以在不侵入 Laravel 核心文件的情况下允许一定数量的密码重置同时存在?我需要延长哪些课程?


提供的答案并没有帮助我覆盖正确的类,但它确实给了我一些如何处理这个问题的想法。所以我最终创建了三个类,所有这些类都扩展了内置类:

数据库令牌存储库

这是我进行覆盖的地方父类 https://github.com/laravel/framework/blob/5.8/src/Illuminate/Auth/Passwords/DatabaseTokenRepository.php允许我的自定义行为;创建新的重置令牌时保留两个最新条目,并在执行重置时检查多个令牌。

<?php

namespace App\Services;

use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
use Illuminate\Auth\Passwords\DatabaseTokenRepository as DatabaseTokenRepositoryBase;

class DatabaseTokenRepository extends DatabaseTokenRepositoryBase
{
    /**
     * Create a new token record.
     *
     * @param  \Illuminate\Contracts\Auth\CanResetPassword  $user
     * @return string
     */
    public function create(CanResetPasswordContract $user)
    {
        $email = $user->getEmailForPasswordReset();

        $this->deleteSomeExisting($user);

        // We will create a new, random token for the user so that we can e-mail them
        // a safe link to the password reset form. Then we will insert a record in
        // the database so that we can verify the token within the actual reset.
        $token = $this->createNewToken();

        $this->getTable()->insert($this->getPayload($email, $token));

        return $token;
    }

    /**
     * Determine if a token record exists and is valid.
     *
     * @param  \Illuminate\Contracts\Auth\CanResetPassword  $user
     * @param  string  $token
     * @return bool
     */
    public function exists(CanResetPasswordContract $user, $token)
    {
        $records = $this->getTable()
            ->where("email", $user->getEmailForPasswordReset())
            ->get();

        foreach ($records as $record) {
            if (
               ! $this->tokenExpired($record->created_at) &&
                 $this->hasher->check($token, $record->token)
            ) {
                return true;
            }
        }
        return false;
    }

    /**
     * Delete SOME existing reset tokens from the database.
     *
     * @param  \Illuminate\Contracts\Auth\CanResetPassword  $user
     * @return int
     */
    protected function deleteSomeExisting($user)
    {
        // TODO: make this configurable in app config
        $limit = 3;
        $records = $this->getTable()
            ->where("email", $user->getEmailForPasswordReset())
            ->orderBy("created_at");
        $ct = $records->count() - $limit + 1;
        return ($ct > 0) ? $records->limit($ct)->delete() : 0;
    }
}

密码经纪管理器

这只是确保使用我上面的自定义存储库类。该函数完全复制自父类 https://github.com/laravel/framework/blob/5.8/src/Illuminate/Auth/Passwords/PasswordBrokerManager.php,但是当然是在不同的命名空间中。

<?php

namespace App\Services;

use Illuminate\Support\Str;
use Illuminate\Auth\Passwords\PasswordBrokerManager as PasswordBrokerManagerBase;

class PasswordBrokerManager extends PasswordBrokerManagerBase
{
    /**
     * Create a token repository instance based on the given configuration.
     *
     * @param  array  $config
     * @return \Illuminate\Auth\Passwords\TokenRepositoryInterface
     */
    protected function createTokenRepository(array $config)
    {
        $key = $this->app['config']['app.key'];

        if (Str::startsWith($key, 'base64:')) {
            $key = base64_decode(substr($key, 7));
        }

        $connection = $config['connection'] ?? null;

        return new DatabaseTokenRepository(
            $this->app['db']->connection($connection),
            $this->app['hash'],
            $config['table'],
            $key,
            $config['expire']
        );
    }
}

密码重置服务提供者

再次强调,只需确保返回自定义类即可。同样,只有命名空间发生变化原本的 https://github.com/laravel/framework/blob/5.8/src/Illuminate/Auth/Passwords/PasswordResetServiceProvider.php.

<?php

namespace App\Providers;

use App\Services\PasswordBrokerManager;
use Illuminate\Auth\Passwords\PasswordResetServiceProvider as PasswordResetServiceProviderBase;

class PasswordResetServiceProvider extends PasswordResetServiceProviderBase
{
    /**
     * Register the password broker instance.
     *
     * @return void
     */
    protected function registerPasswordBroker()
    {
        $this->app->singleton("auth.password", function ($app) {
            return new PasswordBrokerManager($app);
        });

        $this->app->bind("auth.password.broker", function ($app) {
            return $app->make("auth.password")->broker();
        });
    }
}

最后,应用程序配置更新为使用我的提供程序而不是原始提供程序:

    // Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
    App\Providers\PasswordResetServiceProvider::class,

一切都很顺利。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Laravel 中允许多个密码重置令牌 的相关文章

  • PHP 有效读取 csv 文件

    有几种使用 PHP 读取 CSV 文件的方法 我以前用过explode函数将每一行放入一个数组中 然后explode逗号并使用trim删除数据周围的任何引号 本来就很乱 PHP 5 现在有fgetcsv和 str getcsv 我猜这是这些
  • 如何从 Laravel 5 中的 Public/Images 文件夹中删除图像(URL 数据)

    如何从 laravel 5 中的 public images 文件夹中删除图像文件 我从这个网站找到了一些例子 但我知道他们只是在他们的文件中使用文件名record table 但我正在使用类似的东西URL e g localhost pr
  • Laravel 5 与 SAML 2 和现有 IDP 集成

    我使用 Laravel 5 我正在尝试将 SAML 2 0 与其集成 我找到了这个包 https github com aacotroneo laravel saml2 https github com aacotroneo laravel
  • FPDF - 内嵌粗体文本

    我正在尝试从 PHP 创建 PDF 出于法律原因 我们需要将免责声明的一部分设为粗体 并且需要概述免责声明 我当前的代码使用 if isset POST optout POST optout yes pdf gt Ln 5 pdf gt S
  • 配置 .htaccess 以在 PHP 框架 (Silex) 上工作

    我的 Apache2 本地主机 linux 上有一个工作路径 http localhost lab silex web index php hello name 我想成为 http localhost lab silex hello nam
  • 如何从字符串中只获取数字? [复制]

    这个问题在这里已经有答案了 我有这样的字符串 第 001 课 完成 在这种情况下 我只想获取数字部分001 我试过这个 str the title preg match all d str matches number implode ma
  • PHP 中的正则表达式:找到第一个匹配的字符串

    我想在非常长的文本中找到第一个匹配的字符串 我知道我可以使用 preg grep 并获取返回数组的第一个元素 但是 如果我只需要第一场比赛 或者我知道提前只有一场比赛 那么这样做效率不高 有什么建议吗 预匹配 http www php ne
  • 如何在javascript中使用自动递增id?

  • 从提交的表单中转义字符串中的字符

    每次发布帖子时 我都会得到转义字符 gt gt gt 我有一个多步骤表单 它将数据从一种表单传输到另一种表单 我将这些值与准备好的语句一起保存在数据库中 数据库中的值当前看起来像Paul s House 用户应该可以在字符串中使用单引号和双
  • PHP header() 和 jquery mobile

    我想使用 php header Location newpage php 进行重定向 我没有收到错误 但 Jquery mobile 似乎无法加载目标页面 并且地址栏仍保留旧地址 请问您有什么建议吗 Thanks 尝试添加data ajax
  • 登录后所有页面都应该是https吗?

    这有点难以解释 但我会尽力 有一个网站 每个页面上都有登录表单 其中包含用户名 密码字段 这些页面未使用 SSL 用户填写用户名 密码并提交表单后 表单将被发送到 https 的身份验证页面 对于这种情况我有几个疑问 向 https 页面提
  • URL 重写帮助

    RewriteEngine on RewriteCond REQUEST URI index php RewriteRule index php q 1 L 这应该将任何 url 重写为 index php q url 并且它可以工作 反正
  • cURL '格式错误的网址'

    This url 在浏览器中工作得很好 但 cURL 返回错误 3 格式错误的 url 关于解决方法有什么想法吗 EDIT 卷曲代码 function get web page url options array CURLOPT RETUR
  • 我可以显示我在 PHP 中设置的所有 cookie 吗?

    我正在尝试诊断 cookie 中的错误 但 cookie 的名称不是应有的名称 PHP 有没有办法打印我的域设置的所有 cookie 你有没有尝试过 print r COOKIE
  • 在 MySQL 中搜索多个单词

    我使用 HTML 表单来允许用户查找数据库表中的条目
  • php向多个收件人发送邮件

    我可以通过在邮件程序中定义 id 来将电子邮件发送到一个电子邮件 id 但是当用户在表单中键入 消息和电子邮件 id 时 我无法理解如何发送到多个收件人 例如 我正在显示一个带有两个文本区域的表单 一个用于电子邮件 ID 一个用于自定义消息
  • PHP 中的嵌套 JSON 输出

    我正在为 iOS 应用程序构建 API 并尝试将 mySQL 数据转换为 JSON 字符串进行处理 所需的输出将需要顶级订单详细信息 例如客户名称和地址 然后是订购的产品子数组 我需要的两个表中有相当多的字段 我希望拥有所有字段 我已经构建
  • 如何显示不同页眉的页面? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在为我的学校项目开发网站 但我遇到了一个问题 我在每个页面上显示一个标题 我的标题之一包含登录表单 另一标题包含用户名 搜索栏等 问题是
  • PHP 除法浮点值问题

    当我尝试获取余数时 它给出了无效值 我试图获得两位小数的余数 我得到 3 4694469519536E 18 我的价值观是 x 0 1 y 0 005 我尝试了以下方法 echo ed fmod 0 1 0 005 OutPut 3 469
  • 处理查询字符串参数时 Codeigniter 缓存问题

    问候 我正在编写一个 CI Web 应用程序 它实现标准文件缓存功能 如下所示 this gt output gt cache n 我使用了段和查询字符串参数的组合 因此似乎遇到了问题 我在用例和输出类代码中看到的是 缓存仅基于段 像这样

随机推荐

  • 在 Javascript 文件中为 Internet Explorer 编写条件代码

    我想知道是否可以编写条件javascript在 JavaScript 文件中对于 Internet Explorer 即像这样的东西 if is IE7 do this else do this instead 我知道我可以使用头部的条件注
  • 如何获得具有边际比例的双向表?

    考虑一下这个 var1 lt c A B C C G var2 lt c G B B F A df df data frame var1 var2 gt df var1 var2 1 A G 2 B B 3 C B 4 C F 5 G A
  • iPhone OS 4.0.x - 从后台过渡到前台

    iPhone编程问题 是否可以通过编程方式将 iPhone 应用程序从后台模式唤醒 恢复到前台模式 我有一个长时间运行的后台任务 该任务正在 UIApplicationDelegate 的 applicationDidEnterBackgr
  • 如何在 Apache Bench 中发送多个查询字符串?

    ab n 1 c 1 我得到了第一个查询字符串的答案 但我也得到了 superDo 不被识别为内部或外部命令 可运行的程序或批处理文件 请帮我 TIA 问候 蒂鲁 您可能只需要引用 URL 即可避免 shell 特殊字符被解释 在这种情况下
  • 在 Python 中遍历列表列表中的列

    当我尝试跨行中的列进行迭代时 该列在嵌套循环内不会发生变化 i rows 4 i cols 3 matrix 0 for c in xrange i cols for r in xrange i rows for row r in enum
  • Android 从 Google 云端硬盘串流视频

    我正在构建一个 Android 应用程序 需要从 Google 驱动器流式传输视频 视频链接如下 https docs google com file d ID 我无法获取 rtsp 因此它无法在 videoview 中运行视频 并且它不会
  • Angularjs Post 不向 Spring JWT 发送标头

    我有一个由 AngularJs 构建的网络应用程序和一个由 Spring 构建的后端应用程序 我正在使用 JWT 来保护我的应用程序 使用 Get 方法一切正常 在后端级别我得到了我期望的不记名令牌 这样我就可以返回私人信息 但使用 POS
  • PHP 相当于 Ruby 的或等于 (foo ||=bar)?

    在 PHP 中我经常写这样的行 isset foo NULL foo bar 在 ruby 中 有一个绝妙的捷径 称为或等于 https stackoverflow com questions 995593 what does or equ
  • 为什么 dapper 在执行选择时返回 Guid 全零,但表中的 guid 值设置正确?

    我正在使用 dapper 从表中查询数据 然后将其转换为对象 当它被转换为对象时 guid 属性设置为全零 但所有其他属性都设置正确 public class UserStuff public int Id get set public G
  • 我应该将所有方法参数标记为最终参数并指定类型吗

    有效的 dart 指定顶级变量应该是final当适用 https dart lang github io linter lints prefer final fields html https dart lang github io lin
  • Npm 错误:npm 安装命令的 503 服务不可用

    我正在尝试运行 npm install 命令 但出现此错误 Error 503 Service Unavailable for npm install command 任何人都可以请我请求您解决此问题 这是获取错误日志文件时实际发生的完整错
  • 在 IE9-11 中使用 jQuery 更新 SVG 文本

    我正在尝试使用 jQuery 更新 SVG 路径上的文本 它在 Firefox 和 Chrome 中工作正常 但在 IE9 和 IE11 尚未在 10 上测试 但可能是相同的 中文本未更新 有什么想法 解决方法吗 到目前为止 这是我的代码
  • C:同时运行两个函数?

    我在 C 中有两个函数 void function1 do something void function2 do something while doing that 我如何同时运行这两个函数 如果可以的话请举个例子 你会使用线程 例如
  • 如果满足 AWK 中的条件,则打印行范围

    我想做的是使用 awk 在没有管道的情况下显示满足特定条件的行上方 2 行和下方 2 行 例如 我正在搜索字符串 s62234 找到后 我想打印蓝色矩形内的所有行 如所附屏幕截图所示 这是我正在使用的文件 thefmifile txt s6
  • Dart/Flutter:Http 请求引发 XMLHttpRequest 错误 [重复]

    这个问题在这里已经有答案了 我正在尝试制作一个带有 flutter 的 RSS 阅读器 但是该程序提出了XMLHttpRequest error 在我的测试中 我使用网络 Chrome 作为我的目标平台 感谢您的帮助 Future
  • PHP 中的 FPDF 中的特殊字符

    我有一个用户可以填写的网络表单 该内容使用 FPDF 和 PHP 填充 PDF 当用户输入带有撇号的单词时 PDF 中该单词前面会出现斜杠 同样 商标符号等特殊字符的编码也是错误的 FPDF 常见问题解答说要使用 str utf8 deco
  • Kohana 3.3 ORM _has_many _belongs_to

    我正在尝试使用内置的 ORM 在 Kohana 3 3 中设置产品对象 我想要这样 当我打电话时 p1 ORM factory product gt where product type 1 gt find all 它将创建一个具有以下结构
  • 数组的具体化内联函数

    在 Kotlin 中是否可以编写一个具体化类型的内联函数 它可以返回不同类型的Arrays 我想这样的事情 inline fun
  • 适用于 Android 的“频移键控”解码器

    我正在尝试通过 Android 设备的音频端口传输一些数据 我使用 FSK 频移键控 我使用两个不同的频率来表示 1 和 0 是否有任何 Android 库或示例代码来 FSK 解码捕获的音频数据 你可能想看看这个 https code g
  • 在 Laravel 中允许多个密码重置令牌

    Laravel 5 7 密码重置系统的默认行为是在password resets删除该用户的任何其他表后 这种行为是由 Illuminate Auth Passwords DatabaseTokenRepository而且它似乎不可配置 p