ru:https://highload.today/blogs/avtorizatsiya-po-pochte-ili-imeni-na-laravel/ ua:https://highload.today/uk/blogs/avtorizatsiya-po-pochte-ili-imeni-na-laravel/
logo
Веб-разработка      10/01/2022

Создаем авторизацию по почте или имени на Laravel: короткая инструкция

Сергей Гришечкин BLOG

Backend Developer во FlexMade

Лично мне всегда было удобнее использовать почту для логинизации. Совсем непонятно, зачем еще нужно запоминать какой-то 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

English For Tech course.
Лише 7 тижнів по 20-30 хвилин щоденного навчання допоможуть вам подолати комунікативні бар'єри. Отримайте знижку 10% за промокодом ITCENG.
Дійзнайтеся більше

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).

Все, задача выполнена! Вы можете авторизироваться, вводя либо почту, либо имя пользователя в одном и том же поле:

If you have found a spelling error, please, notify us by selecting that text and pressing Ctrl+Enter.

Курс Business English для фінансистів.
Навчіться на практиці, як підбирати доречний tone of voice для спілкування з топменеджментом, колегами та клієнтами. Опануй англійську для фінансистів.
Дізнатись про курс

Этот материал – не редакционный, это – личное мнение его автора. Редакция может не разделять это мнение.

Топ-5 самых популярных блогеров марта

Founder at Shallwe, Python Software Engineer (Django/React)
Всего просмотровВсего просмотров
95
#1
Всего просмотровВсего просмотров
95
Career Consultant в GoIT
Всего просмотровВсего просмотров
90
#2
Всего просмотровВсего просмотров
90
CEO & Founder в Trustee
Всего просмотровВсего просмотров
43
#3
Всего просмотровВсего просмотров
43
Рейтинг блогеров

Ваша жалоба отправлена модератору

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: