Laravel 5.2.x密码代理使用用户名作为电子邮件列名称

时间:2016-05-10 20:34:57

标签: laravel laravel-5 laravel-5.2

我们继承了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的接口,但它负责保存密码重置记录。

1 个答案:

答案 0 :(得分:0)

好的,经过大量的烦恼,我发现了它。为了保留语义列用户名而不是使用电子邮件进行密码重置:

有两个步骤:

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中覆盖,所以我从用户模型中删除了特征,并在应用程序命名空间中应用了我自己的副本:

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;
    }
}

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