3

我正在尝试允许用户使用电子邮件或用户名及其密码登录。

我在 FortifyServiceProvider.php 的 boot() 中添加了以下代码:

Fortify::authenticateUsing(function (Request $request) {
        $user = User::where('email', $request->email)
            ->orWhere('username', $request->username)
            ->first();

        if ($user &&
            Hash::check($request->password, $user->password)) {
            return $user;
        }
    });

但是现在当用户尝试通过输入他们的用户名而不是电子邮件来登录时,他们会收到以下错误消息:

These credentials do not match our records.
4

3 回答 3

1

我忘记更改以下行:

->orWhere('username', $request->username)

到:

->orWhere('username', $request->email)

因为我的登录表单中只有一个字段可以保存电子邮件或用户名。此字段的名称是“电子邮件”。

于 2020-11-20T08:02:03.473 回答
0

很好的答案,这很好用!

对于那些使用 Vue.js 的人:

  1. 确保在 Login.vue (resources/js/Pages/Auth/) 中将 'email' 输入的 'type' 属性从 'email' 更改为 'text' ( type="text"),否则会出现验证错误。还将标签值更改为“用户名或电子邮件”。

  2. username: this.user.username确保“Register.vue”和“UpdateProfileInformation.vue”(resources/js/Pages/Profile)在模板和脚本数据表单中输入了“用户名” 。

  3. 确保 'CreateNewUser.php' 和 'UpdateUserProfileInformation.php' (app/Actions/Fortify/) 方法包括此字段(使用“唯一”规则)。

  4. 确保“用户”模型具有字段“用户名”(唯一,具有关联的数据库迁移)。

于 2021-02-07T03:44:40.443 回答
0

首先在文档中自定义用户身份验证

    public function boot()
    {
        Fortify::authenticateUsing(function (Request $request) {
            $user = User::where('email', $request->email)->first();
    
            if ($user &&
                Hash::check($request->password, $user->password)) {
                return $user;
            }
        });
    
        // ...
    }

过滤您的请求:

$username = filter_var($request->email, FILTER_VALIDATE_EMAIL) ? 'email' : 'name';
Fortify::authenticateUsing(function (Request $request) {
            $username = filter_var($request->email, FILTER_VALIDATE_EMAIL) ? 'email' : 'name';
            $user = User::where($username, $request->email)
                ->first();
            if (
                $user &&
                Hash::check($request->password, $user->password)
            ) {
                return $user;
            }
        });
于 2021-09-20T10:05:31.563 回答