使用 Fortify Laravel 8 使用电子邮件或用户名登录

Login with either email or username with Fortify Laravel 8

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

我在 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.

我忘记更改以下行:

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

收件人:

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

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

很好的答案,效果很好!

对于使用 Vue.js 的用户:

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

  2. 确保 'Register.vue' 和 'UpdateProfileInformation.vue' (resources/js/Pages/Profile) 在模板中输入 'Username' 并在脚本数据中输入 username: this.user.username表格.

  3. 确保 'CreateNewUser.php' 和 'UpdateUserProfileInformation.php' (app/Actions/Fortify/) 方法包含此字段(使用 'unique' 规则)。

  4. 确保 'User' 模型有一个字段 'username'(唯一的,与关联的数据库迁移)。

首先如自定义用户身份验证文档中所述

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