【问题标题】:Laravel 5.2.x Password Broker using Username as the Email Column name使用用户名作为电子邮件列名称的 Laravel 5.2.x 密码代理
【发布时间】:2016-05-10 20:34:56
【问题描述】:

我们继承了一个 CakePHP 代码库和一个模式。将其移植到 Laravel 5.2.x,但我们必须维护他们在模式中使用用户名而不是电子邮件的模式。所以我正在尝试使用用户名列来重置密码。

我已将 ResetPasswords::sendResetLinkEmail 拉入 PasswordController 以覆盖它并验证用户名而不是电子邮件,并将用户名传递给 sendResetLink 以便用户可以通过身份验证:

public function sendResetLinkEmail(Request $request)
{
    $this->validate($request, [
        'username' => 'required|email',
    ]);

    $broker = $this->getBroker();

    $response = Password::broker($broker)->sendResetLink(
        $request->only('username'), $this->resetEmailBuilder()
    );

    // ...

但是,在 PasswordBroker 中调用第 ~91 行的方法后会引发错误:

$token = $this->tokens->create($user); // line 91

现在我不知道这是怎么回事,因为它似乎正在调用一个依赖注入到 PasswordBroker 中的接口,但它负责保存密码重置记录。

【问题讨论】:

    标签: laravel laravel-5 laravel-5.2


    【解决方案1】:

    好的,经过一番大惊小怪,我想通了。为了保留语义列用户名而不是使用电子邮件进行密码重置:

    有两个步骤:

    1) 您需要将ResetsPasswords::sendResetLinkEmail 拉到您的 PasswordController 中,并让它验证并将用户名传递给 sendResetLink,这在问题中,但为了完整性也包括在下面:

    /**
     * Send a reset link to the given user.
     *
     * @param  \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     */
    public function sendResetLinkEmail(Request $request)
    {
        $this->validate($request, [
            'username' => 'required|email',
        ]);
    
        $broker = $this->getBroker();
    
        $response = Password::broker($broker)->sendResetLink(
            $request->only('username'), $this->resetEmailBuilder()
        );
    
        switch ($response) {
            case Password::RESET_LINK_SENT:
                return $this->getSendResetLinkEmailSuccessResponse($response);
    
            case Password::INVALID_USER:
            default:
                return $this->getSendResetLinkEmailFailureResponse($response);
        }
    }
    

    2) 这个问题的关键,似乎需要一段时间才能弄清楚,但本质上非常简单,但据我所知,完全没有文档记录是将用户模型上使用的特征 CanResetPassword::getEmailForPasswordReset 更改为也使用用户名而不是电子邮件,您不想在 CanResetPassword 中覆盖它,因此我从 User 模型中删除了该特征并将我自己的副本应用到应用程序命名空间中:

    namespace App\Traits\Auth;
    
    trait CanResetPassword
    {
        /**
         * Get the e-mail address where password reset links are sent.
         *
         * @return string
         */
        public function getEmailForPasswordReset()
        {
            return $this->username;
        }
    }
    

    现在您可以发送密码重置链接,并重置密码。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-09-25
      • 1970-01-01
      • 2018-12-25
      • 1970-01-01
      • 2020-06-22
      • 2016-09-24
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      相关资源
      最近更新 更多