Аутентификация в Laravel

Apr 6, 04:15 am Категория:

Второй раз зайду в тему. Для меня действительно было шоком осознание того, что админка и пароль на вход в закрытые зоны могут создаваться отдельно. Такой вот шаблон, отпечатавшийся в мозгах до уровня принятия формы извилины. Плохо, что тупил. Хорошо, что перестал. К паролям.

У прекрасной тулзы “artisan” есть опция показа всех маршрутов роутера. Отличная штука. Я уже писал, что у меня в роутере всё очень скромно, ничего лишнего. И писал, что после выполнения

./artisan make:auth

происходит несколько трансформаций, после которых меняется и роутер.

<?php
Route::group(['middleware' => ['web']], function () {
	Route::get('/{id?}', 'PagesController@show')->where('id', '\d+');
	Route::get('contacts', 'ContactsController@getContacts');
	Route::post('contacts', 'ContactsController@postContacts');
});
Route::group(['middleware' => 'web'], function () {
    Route::auth();
    Route::get('/home', 'HomeController@index');
});

А теперь о магии: на рисунке ниже отчётливо видно две таблицы. Первая – это маршруты до изменения роутера, а вторая, соответственно – после. Состав не так важен. Важен размер.

Добавилось 9 маршрутов, по названиям которых становится понятно, что помимо аутентификации и логаута у меня появились регистрация и сброс пароля. К сожалению эта конфигурация подходит только для демонстрации на лабораторной работе. Магия – это вообще опасная штука, а в случае с сайтом ещё и очень дорогая. Поэтому сейчас я буду приводить эту эльфийскую поделку в соответствие с реалиями окружающего мира.

Самый лучший способ избежать взлома – сделать вид, что ломать нечего. На следующий день после установки своего одностраничинка я обнаружил попытку регистрации и аутентификации по адресам, которые обычно используются для этого в Laravel. Разумеется взломщики обломались. А произошло это потому, что я гений закомментировал добавленные в роутер строчки и главное – Route::auth(). Этот метод аналогичен добавлению таких строк:

 
// Authentication Routes...
$this->get('login', 'Auth\AuthController@showLoginForm');
$this->post('login', 'Auth\AuthController@login');
$this->get('logout', 'Auth\AuthController@logout');
// Registration Routes...
$this->get('register', 'Auth\AuthController@showRegistrationForm');
$this->post('register', 'Auth\AuthController@register');
// Password Reset Routes...
$this->get('password/reset/{token?}', 'Auth\PasswordController@showResetForm');
$this->post('password/email', 'Auth\PasswordController@sendResetLinkEmail');
$this->post('password/reset', 'Auth\PasswordController@reset');

Приятно, что маршруты не уводят в даль светлую, а заканчиваются готовыми для ввода данных шаблонами, со встроенными сообщения ошибок ввода. Реализация похожа на ту, что я показывал в публикации по отправке email. Точнее, у меня она сделана так же.

Регистрация пользователя

Аутентификации пользователя

Сброс пароля

Перед началом использования этих форм необходимо настроить базу данных и накатить стандартные миграции:

./artisan migrate

О миграциях и операциях с ними я уже писал. Для начала работы с аутентификацией доработок не требуется и формы как раз рассчитаны на стандартные таблицы.

Огромное спасибо за такой подгон, но лучше всё сделать самому, чтобы управлять ситуацией. Регистрацию, к примеру, в некоторые проекты не стоит добавлять. В свой проект с одним автором можно не добавлять маршруты сброса пароля и удовлетвориться простым выводом формы аутентификации и обеспечить процесс входа/выхода. Причём, изменив сам маршрут, заменив ключевое слово login на имя любимой кошки, добавив перед ним фамилию любимого актёра. Пусть перед подбором пароля адрес подберут, собаки.

А быстрый тюнинг стандартной аутентификации я бы делал так:

  1. Установить чистый Laravel
  2. Установить скелет аутентификации ./artisan make:auth
  3. Настроить подключение к базе данных
  4. Накатить миграции ./artisan migrate
  5. Зайти по адресу http://yuoir.site/register и создать минимум одного пользователя

После этого запускаем любимый редактор и переходим к коду. Сначала меняем роутер. Я привожу только часть, относящуюся к аутентификации. Маршруты не имеющие отношения к логинам/паролям не трогаем.

Route::group(['prefix' => 'myauth', 'middleware' => ['web'], 'namespace' => 'Auth'], function() {
    Route::get('login', 'AuthController@showLoginForm');
    Route::post('login', 'AuthController@login');
    Route::get('logout', 'AuthController@logout');
});
Route::group(['prefix' => 'figwamadminka', 'middleware' => ['web','auth'], 'namespace' => 'Admin'], function() {
    Route::get('/', 'AdminController@getDashboard');
});

В первой строке сразу два интересных момента:

  • ‘prefix’ => ‘myauth’ – маршруты начинающиеся с myauth
  • ‘namespace’ => ‘Admin’ – по умолчанию используют контроллеры из директории app/Http/Controllers/Auth

Шестая строка добавляет интереса

  • ‘middleware’ => [‘auth’] – доступ только через аутентификацию

И теперь для прохождения процесса аутентификации я должен идти по адресу http://mysite/myauth/login. Так же будет работать адрес /myauth/logout и всё. Регистрацию и сброс пароля я не заказывал. Нужно не забыть внести соответствующие правки в код blade шаблона. Разумеется префикс можно брать любой. Перед тестированием, чтобы не испытать чувство глубокого разочарование, нужно внести изменения в файлы app/Http/Controllers/Auth/AuthController.php, и app/Http/Middleware/Authenticate.php. В противном случае не будет находиться форма ввода логина/пароля при попытке неавторизованного доступа в закрытые обаласти, а после успешной аутентификации будет производиться переадресация в корень сайта.

<?php namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class Authenticate
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->guest()) {
            if ($request->ajax() || $request->wantsJson()) {
                return response('Unauthorized.', 401);
            } else {
                return redirect()->guest('myauth/login');
            }
        }
        return $next($request);
    }
}

и фрагмент AuthController.php

    /**
     * Where to redirect users after login / registration.
     *
     * @var string
     */
    protected $redirectTo = '/figwamadminka/dashboard';

Теперь при попытке входа по адресу /figwamadminka/dashboard и при прямом вызове /myauth/login будет вызываться форма аутентификации. После ввода логина и пароля пользователь перенаправляется на /figwamadminka/dashboard, где его “должна ждать” заранее подготовленная главная страница админки. На время отладки можно задействовать полученный вместе с каркасом аутентификации HomeController, из которого следует удалить конструктор, т.к. он повторяет действия, “заказанные” в роутере. Всё. Пилите админку, малята.

Теги этой статьи:

 

Комментарии

2017-08-18 8:33 pm , Оставь комментарий