【问题标题】:Laravel 5.3 E-Mail ConfirmationLaravel 5.3 电子邮件确认
【发布时间】:2017-04-17 08:13:17
【问题描述】:

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

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

验证本身也已经实现。

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

【问题讨论】:

  • 如果对您有帮助,请接受我的回答或问我任何问题

标签: php authentication laravel-5.3 confirmation-email


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    我现在已经用我的个人喜好覆盖了 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 文件中。

    我现在唯一需要知道的是如何检测登录失败的原因,以便我可以告诉用户他/她的电子邮件/密码组合是否错误或他们的帐户尚未激活。

    感谢您的帮助!

    【讨论】:

    • 好的,我想知道如何检测用户无法登录的原因,以便给用户更好的反馈,但我无论如何都找不到。
    【解决方案3】:

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

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

    将此添加到您的控制器

    【讨论】:

    • 我在任何地方都找不到任何 AuthController。我还在 laravel 文档上找到了您的解决方案,但无法弄清楚如何实现这一点。 Laravel 5.3 的 make:auth 行为我创建了一个 LoginController 和 RegisterController(还有一些东西,但与这个主题无关)。在任何地方都找不到 AuthController :(
    • 那么就是 LoginController 把它加进去
    • 我试过了,但是控制器将不知道所有变量($email、$password),因为没有数据传递给 authenticate() 函数。
    • 你需要覆盖
    • 我在家的时候试试。但我不知道我是否只是愚蠢或如何获得 $email 和 $password 变量?没有请求传递给身份验证或我可以从中检索所需数据的任何其他内容。几小时后我到家会回来报告
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多