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

Настройки

Настройки аутентификации, находятся в файле config\auth.php

'defaults' => [
    'guard' => 'web',
    'passwords' => 'users',
],

guard‘ – охранник;
web‘ – группа настроек, которая раскрыта ниже в файле ;
passwords‘ – определяет логику сброса пароля;
users‘ – группа настроек, которая так же раскрыта ниже в файле.

'guards' => [
    'web' => [
            'driver' => 'session',
            'provider' => 'users',
    ],

    'api' => [
            'driver' => 'token',
            'provider' => 'users',
    ],
],

guards‘ – массив охранников;
web‘ и ‘api‘ – охранники;
driver‘ – параметр, который определяет как информация о пользователе будет передаваться от запроса к запросу (по-умолчанию – сессия);
users‘ – для охранников определен провайдер ‘users’, который описан ниже в настройке providers.

'providers' => [
    'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
    ],

В массиве провайдеров указано как будут данные о пользователе получены из БД.
То есть в данном случае используется ‘Eloquent’ (реализация шаблона ActiveRecord в Laravel) и указан класс модели для работы.

'passwords' => [
    'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
    ],
],

Тут настраивается механизм сброса пароля.
users‘ – расшифровывается параметр, который указан в первом массиве — ‘defaults‘;
table‘ – содержит название таблицы из БД предназначенной для сброса пароля. Данная таблица формируется при выполнении миграций, которые присутствуют в папке database\migrations при установке Laravel. То есть не забудьте выполнить миграции для формирования таблиц.
expire‘ – кол-во минут отведенное для сброса пароля.

 

Создание страниц аутентификации, контроллеров, маршрутов

Автоматическое создание страниц входа, регистрации, а так же контроллеров и маршрутов их обрабатывающих происходит вызовом всего одной команды из командной строки:

# php artisan make:auth

Для добавления в базу данных базы пользователей необходимо настроить доступы в файле .env и выполнив команду миграции:

# php artisan migrate

Шаблоны страниц аутентификации.
В папке видов resources\views создадутся такие файлы:

  • layouts/app.blade.php — родительский шаблон
  • home.blade.php — информационная панель (dashboard) для вошедших пользователей
  • auth/login.blade.php — страница входа
  • auth/register.blade.php — страница регистрации
  • auth/passwords/email.blade.php — страница подтверждения сброса пароля
  • auth/passwords/reset.blade.php — страница для сброса пароля

Контроллеры
При выполнении данной команды создастся контроллер app\Http\Controllers\HomeController.php подключающий домашнюю страницу.
В данном контроллере подключается посредник ‘auth‘:

public function __construct()
{
    $this->middleware('auth');
}

запрещающий доступ пользователям не прошедшим аутентификацию к данному контроллеру, а вернее к страницам, которые выводятся с помощью данного контроллера.
Так же в директории с контроллерами создастся папка Auth содержащая другие контроллеры, необходимые для использования аутентификации:

  • ForgotPasswordController;
  • LoginController;
  • RegisterController;
  • ResetPasswordController

Автоматически пропишутся маршруты в файле routes\web.php

Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');

Команда Auth::routes() вызывает метод routes() фасада Auth из файла
vendor\laravel\framework\src\Illuminate\Support\Facades\Auth.php
и подключает несколько стандартных маршрутов для страниц аутентификации, регистрации, сброса пароля из файла vendor\laravel\framework\src\Illuminate\Routing\Router.php:

// Authentication Routes...
$this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
$this->post('login', 'Auth\LoginController@login');
$this->post('logout', 'Auth\LoginController@logout')->name('logout');

// Registration Routes...
$this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
$this->post('register', 'Auth\RegisterController@register');

// Password Reset Routes...
$this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
$this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
$this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
$this->post('password/reset', 'Auth\ResetPasswordController@reset');

Чтобы протестировать созданные автоматически файлы и посмотреть работу аутентификации, перейдите по ссылке
http://yoursite/home
В данном контроллере подключен посредник ‘auth‘, а аутентификация не пройдена – будет перенаправление на страницу входа. Чтобы залогиниться нужно сначала зарегистрироваться через форму, пароли заданные прямо в БД миграцией или запросом не работают (должны быть зашифрованы). На странице входа, сверху справа, есть ссылка для регистрации.
При успешной аутентификации будет перенаправление на страницу /home и надпись «You are logged in!».

 

Применение

Например нужно закрыть вход для определенной страницы. Для тестирования сначала нужно «выйти», если до этого залогинились.

Указываем для маршрута:

Route::get('/hidden', ['uses' => 'ContactController@show'])->name('hidden')->middleware('auth');

или

Route::get('/hidden', ['middleware'=>['auth'], 'uses' => 'ContactController@show'])->name('hidden');

auth‘ – алиас для класса посредника Illuminate\Auth\Middleware\Authenticate заданный в файле app\Http\Kernel.php

Указываем в контроллере:

public function __construct()
{
    $this->middleware('auth');
}

Например для админки создаем группу маршрутов и указываем им посредник ‘auth‘ для входа только зарегистрированным пользователям:

//группа admin/ с аутентификацией
Route::group(['prefix' => 'admin', 'middleware' => 'auth'], function(){
    Route::get('/', ['uses' => 'admin\AdminController@show'])->name('admin_index');
    ...
});

Контроллер app\Http\Controllers\admin\AdminController.php

<?php
namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class AdminController extends Controller
{
    public function show(){
        return view('welcome');
    }
}

Теперь при переходе по ссылке http://yoursite/admin, если пользователь не вошел, будет перенаправление на страницу http://yoursite/login и пока не пройдена аутентификация — доступа к странице выводящейся шаблоном «welcome» не будет.