在发送重置链接之前,Laravel重置密码检查额外活动列

时间:2016-12-18 18:09:11

标签: php laravel

class LoginController extends Controller
{
    #overwrite trait AuthenticatesUsers->credentials
    protected function credentials(Request $request)
    {   
        return array_merge( $request->only($this->username(), 'password'), ['active' => 1]);
    }
}


class ForgotPasswordController extends Controller
{
    //try to overwrite here
}

\vendor\laravel\framework\src\Illuminate\Auth\Passwords\PasswordBroker.php
class PasswordBroker implements PasswordBrokerContract
{
     if (is_null($user) || $user->active != 1) { <-- add $user->active != 1
        return static::INVALID_USER;
     }

}

我通过添加电子邮件自定义Laravel注册/登录系统&#39;有效&#39;列。

在我的登录控制器中,我覆盖trait以检查活动列,但我在重置密码时遇到问题。

我现在所做的是将$user->active !=1添加到PaswordBroker中,它运行正常,但

我不想触及供应商的文件,我希望在我的控制器中覆盖它。

谁知道如何实现这个目标?

2 个答案:

答案 0 :(得分:1)

它是在类的sendResetLinkEmail中完成的,请像这样覆盖:

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

    $response = $this->broker()->sendResetLink([
        'email' => $request->input('email'),
        'active' => true,
    ]);

    return $response == Password::RESET_LINK_SENT
        ? $this->sendResetLinkResponse($response)
        : $this->sendResetLinkFailedResponse($request, $response);
}

答案 1 :(得分:0)

如果你想要,尝试重新初始化一个新的类扩展PasswordBroker,之后尝试覆盖方法(将你的条件添加到...那个方法)。

class YourClass extends PasswordBroker
{ 
    public function sendResetLink(array $credentials, Closure $callback = null)
    {
        $user = $this->getUser($credentials);

        if (is_null($user) || $user->active != 1) {
            return PasswordBrokerContract::INVALID_USER;
        }

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

        $this->emailResetLink($user, $token, $callback);

        return PasswordBrokerContract::RESET_LINK_SENT;
    }
}

我不知道您使用的是Laravel版本,我使用的是5.2。

希望这有帮助!