Войдите в систему с помощью электронной почты или имени пользователя с помощью Fortify Laravel 8

#php #laravel #laravel-8 #laravel-authentication #laravel-fortify

#php #laravel #laravel-8 #laravel-аутентификация #laravel-fortify

Вопрос:

Я пытаюсь разрешить пользователям входить в систему, используя либо электронную почту, либо имя пользователя вместе со своим паролем.

Я добавил следующий код внутри boot () в FortifyServiceProvider.php :

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

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

Но теперь, когда пользователи пытаются войти в систему, введя свое имя пользователя вместо электронной почты, они получают следующее сообщение об ошибке:

 These credentials do not match our records.
 

Ответ №1:

Я забыл изменить следующую строку:

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

Для:

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

Потому что просто в моей форме входа есть только одно поле, которое может содержать либо адрес электронной почты, либо имя пользователя. Имя этого поля — «email».

Ответ №2:

Отличный ответ, это сработало хорошо!

Для тех, кто использует Vue.js:

  1. Убедитесь, что в Login.vue (ресурсы / js / Страницы / Auth/) вы изменили атрибут ‘type’ ввода ’email’ с ’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 /) включают это поле (с «уникальным» правилом).
  4. Убедитесь, что в модели «User» есть поле «username» (уникальное, с соответствующей миграцией БД).

Ответ №3:

Сначала, как в документации, настраивающей аутентификацию пользователя

     public function boot()
    {
        Fortify::authenticateUsing(function (Request $request) {
            $user = User::where('email', $request->email)->first();
    
            if ($user amp;amp;
                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 amp;amp;
                Hash::check($request->password, $user->password)
            ) {
                return $user;
            }
        });