Лично мне всегда было удобнее использовать почту для логинизации. Совсем непонятно, зачем еще нужно запоминать какой-то username для каждого отдельного сайта. Видимо, такой же логикой руководствуются разработчики Laravel, предоставляя «из коробки» систему авторизации на основе почтового адреса. Но если вдруг вы захотите/поступит задача дать пользователю возможность входа через email или username на выбор — эта короткая инструкция вам в помощь!
Итак, установим свежий экземпляр Laravel:
composer create-project --prefer-dist laravel/laravel app
Или, если у вас уже имеется глобально установленный фреймворк:
laravel new app
Далее выполняем команду быстрого создания маршрутов, контроллеров и шаблонов для авторизации:
php artisan make:auth
Убедитесь, что данные в файле .env
(корень проекта) соответствуют настройкам вашей базы данных. При необходимости создайте схему с нужным названием (если оставить настройки в .env
без изменений, то ваша база данных должна называться laravel
, пользователь — root
, без пароля).
Запускаем команду миграций БД:
php artisan migrate
Cтартуем работу встроенного php-сервера:
php artisan serve
И, запустив в браузере http://127.0.0.1:8000/register
, можем создать нашего первого пользователя:
Если все сделано правильно, то теперь вы можете залогиниться, используя указанную почту. Внесем нужные изменения в код, чтобы можно было заходить на сайт, используя как почту, так и имя пользователя.
Начнем с фронтенда. В файле resources/views/auth/login.blade.php
находим блок, ответственный за ввод логина:
И меняем его на следующий код:
<div class="form-group row"> <label for="login" class="col-sm-4 col-form-label text-md-right"> {{ __('Email or Username') }} </label> <div class="col-md-6"> <input id="login" type="text" class="form-control{{ $errors->has('login') ? ' is-invalid' : '' }}" name="login" value="{{ old('login') }}" required autofocus> @if ($errors->has('login')) <span class="invalid-feedback"> <strong>{{ $errors->first('login') }}</strong> </span> @endif </div> </div>
Здесь мы объявили о возможности ввода как почтового адреса, так и имени, указанного при регистрации. Также немного изменили обработку ошибок на случай неправильно введенных данных.
Теперь главное: меняем код логинизации.
Для этого откроем LoginController
, расположенный здесь: app/Http/Controllers/Auth/LoginController.php
И внесем изменения:
namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\AuthenticatesUsers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class LoginController extends Controller { use AuthenticatesUsers; protected $redirectTo = '/home'; protected $loginType; public function __construct() { $this->middleware('guest')->except('logout'); $this->loginType = $this->checkLoginInput(); } public function login(Request $request) { $this->validate($request, [ 'login' => 'required|string', 'password' => 'required|string' ]); $credentials = [ $this->loginType => $request->login, 'password' => $request->password ]; if (Auth::attempt($credentials)) { return redirect()->intended($this->redirectTo); } return redirect()->back() ->withInput() ->withErrors([ 'login' => 'These credentials don\'t match our records.' ]); } protected function checkLoginInput() { $inputData = request()->get('login'); return filter_var($inputData, FILTER_VALIDATE_EMAIL) ? 'email' : 'name'; } }
Здесь мы добавили защищенное свойство LoginType
, в котором будем хранить название поля в таблице базы данных, по которому нужно делать аутентификацию. Конструктор класса обновляет это свойство в зависимости от типа строки, которую вводит пользователь. PHP-функция filter_var
фильтрует данные и нужное поле присваивается LoginType.
Далее метод login
, который содержится в трейтеМеханизм, который обеспечивает повторное использование кода в языках с поддержкой единого наследования.
AuthenticatesUsers
мы перезаписываем непосредственно в нашем контроллере. В нем создаем массив credentials
с указанием поля, по которому следует проводить аутентификацию (в зависимости от введенных данных это будет либо email, либо name).
Все, задача выполнена! Вы можете авторизироваться, вводя либо почту, либо имя пользователя в одном и том же поле:
Читайте также: Как написать одностраничное приложение на Laravel и Vue.js за 45 минут
Это текст из личного блога, опубликованный с разрешения автора.
Этот материал – не редакционный, это – личное мнение его автора. Редакция может не разделять это мнение.
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: