Laravel 5.3 电子邮件确认

Laravel 5.3 E-Mail Confirmation

我需要实现在用户能够登录我的平台之前确认用户电子邮件地址的功能。

我已经成功实现了在注册时发送确认码,并在数据库中保存了一个字符串 "confirmation_code" 和一个关于用户是否被确认的布尔值 "confirmed"。

验证本身也已经实现。

现在我遇到的唯一问题是在登录时检查用户是否已确认。 我阅读了 Laravel 5.3 的 API,但我不知道如何以我喜欢的方式编辑登录过程。我不喜欢对laravel原有的功能改动太多,只想在登录时的认证过程中加入一个简单的参数。有那么难吗?

假设您使用默认的 LoginController 覆盖控制器中的身份验证方法

public function authenticate()
{
    if (Auth::attempt(['email' => $email, 'password' => $password, 'confirmed'=>1])) {
        // Authentication passed...
        return redirect()->intended('dashboard');
    }
}

将此添加到您的控制器

好的,我找到了解决问题的方法。

我现在已经根据个人喜好覆盖了 attemptLogin(Request $request) 函数。如果你知道你必须寻找什么,那没什么大不了的。我认为应该在 laravel 文档中以某种方式对其进行澄清,因为身份验证本身根本不起作用。

但是,如果有人感兴趣,这是我的代码:

protected function attemptLogin(Request $request){
    return $this->guard()->attempt([
        'email' => $request->email,
        'password' => $request->password,
        'confirmed' => 1
    ], $request->has('remember'));
}

上面的代码写在我的 LoginController.php 文件中。

我现在唯一需要弄清楚的是如何检测登录失败的原因,这样我就可以告诉用户 his/her email/password 组合是错误的还是他们的帐户尚未激活.

感谢您的帮助!

Laravel 5.3

我知道这个问题有点老,但任何人都在寻找答案,让您轻松保留 Laravel 的 Auth 的所有功能。我相信我有一个。

如果您查看 Auth\AuthenticateUser,您会注意到方法 login 使用方法 attemptLogin,它从方法 credentials 获取凭据数组].

不要覆盖整个登录流程,只需覆盖 credentials 方法,这样您就可以简单地设置电子邮件确认而不会丢失错误消息等。

对于电子邮件确认验证,在您的情况下,您可以执行以下操作:

protected function credentials(Request $request)
    {
        $credentials = $request->only($this->username(), 'password');
        $credentials['confirmed'] = 1;
        return $credentials;
    }