Подробное руководство по аутентификации Laravel

Опубликовано: 2023-03-23

Аутентификация — одна из наиболее важных и важных функций веб-приложений. Веб-фреймворки, такие как Laravel, предоставляют пользователям множество способов аутентификации.

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

Это руководство научит вас всему, что вам нужно знать, чтобы начать работу с выбранными вами методами аутентификации Laravel.

Читай дальше!

Введение в аутентификацию Laravel

Laravel представляет модули, состоящие из «охранников» и «провайдеров». Охранники определяют аутентификацию пользователя для каждого запроса, а провайдеры определяют извлечение пользователя из постоянного хранилища (например, из базы данных MySQL).

Мы определяем наши параметры аутентификации в файле с именем config/auth.php . Он включает в себя несколько опций для настройки и изменения поведения аутентификации Laravel.

Во-первых, вы должны определить параметры аутентификации по умолчанию. Этот параметр управляет «защитой» аутентификации вашего приложения по умолчанию и параметрами сброса пароля. Вы можете изменить эти значения по умолчанию по мере необходимости, но они идеально подходят для большинства приложений.

Затем вы определяете средства защиты аутентификации для своего приложения. Здесь наша конфигурация по умолчанию использует хранилище сеансов и поставщика пользователей Eloquent. Все драйверы аутентификации имеют провайдера пользователя.

 return [ /* Defining Authentication Defaults */ 'defaults' => [ 'guard' => 'web', 'passwords' => 'users', ], /* Defining Authentication Guards Supported: "session" */ 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], ], /* Defining User Providers Supported: "database", "eloquent" */ 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], // 'users' => [ // 'driver' => 'database', // 'table' => 'users', // ], ], /* Defining Password Resetting */ 'passwords' => [ 'users' => [ 'provider' => 'users', 'table' => 'password_resets', 'expire' => 60, 'throttle' => 60, ], ], /* Defining Password Confirmation Timeout */ 'password_timeout' => 10800, ];

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

Пользователи также могут захотеть сбросить свои пароли. Для этого вы можете указать несколько конфигураций сброса пароля, если у вас есть более одной пользовательской таблицы или модели в приложении и вам нужны отдельные настройки, основанные на конкретных типах пользователей. Срок действия — это количество минут, в течение которых каждый токен сброса будет действителен. Эта функция безопасности обеспечивает недолговечность токенов, поэтому у них меньше времени на угадывание. Вы можете изменить это по мере необходимости.

В конечном счете, вы должны определить время до истечения срока действия подтверждения пароля, и пользователю будет предложено повторно ввести свой пароль через экран подтверждения. По умолчанию тайм-аут длится три часа.

Типы методов аутентификации Laravel

Не существует идеального способа проверки подлинности каждого сценария, но их знание поможет вам принимать более правильные решения. Это и то, как Laravel развивается с новыми функциями в Laravel 9. Это значительно упрощает нашу работу как разработчиков при переключении режимов аутентификации.

Аутентификация на основе пароля

В качестве рудиментарного способа аутентификации пользователя он до сих пор используется тысячами организаций, но, учитывая текущее развитие, он явно устаревает.

Поставщики должны применять сложные реализации паролей, обеспечивая при этом минимальные трения для конечного пользователя.

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

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

Эта методология используется, когда пользователю выдается уникальный токен после проверки.

Имея этот токен, теперь пользователь может получить доступ к соответствующим ресурсам. Привилегия активна до истечения срока действия токена.

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

Сегодня токены широко используются в различных сценариях, поскольку они представляют собой объекты без сохранения состояния, которые содержат все данные аутентификации.

Предоставление способа отделить создание токенов от проверки токенов дает поставщикам большую гибкость.

Многофакторная аутентификация

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

В отличие от двухфакторной аутентификации, которая включает только два фактора, этот метод может включать два, три, четыре и более…

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

Как реализовать аутентификацию Laravel

Этот раздел научит вас нескольким способам аутентификации пользователей вашего приложения. В некоторых библиотеках, таких как Jetstream, Breeze и Socialite, есть бесплатные руководства по их использованию.

Ручная аутентификация

Начиная с регистрации пользователей и создания необходимых маршрутов в routes/web.php .

Мы создадим два маршрута, один для просмотра формы и один для регистрации:

 use App\Http\Contrllers\Auth\RegisterController; use Illuminate\Support\Facades\Route; /* Web Routes Register web routes for your app's RouteServiceProvider in a group containing the "web" middleware */ Route::get('/register', [RegisterController::class], 'create']); Route::post('/register', [RegisterController::class], 'store']);

И создайте контроллер, необходимый для тех:

 php artisan make controller Auth/RegisterController -r

Теперь обновите код следующим образом:

 namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use illuminate\Htpp\Request; class RegisterController extends Controller { public function create() { return view('auth.register'); } public function store(Request $request) { } }

Теперь контроллер пуст и возвращает представление для регистрации. Давайте создадим это представление в resources/views/auth и назовем его register.blade.php .

Представление лезвия Laravel для регистрации пользователей.
Представление лезвия Laravel для регистрации пользователей.

Теперь, когда все готово, мы должны посетить наш маршрут /register и увидеть следующую форму:

 public function store(Request $request) { $credentials = $request->only('email', 'password'); if (Auth::attempt($credentials, $request->filled('remember'))) { $request->session()->regenerate(); return redirect()->intended('/'); } return back()->withErrors([ 'email' => 'The provided credentials do not match our records.', ]); }

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

Мы будем использовать функцию проверки запросов Laravel, чтобы убедиться, что требуются все три учетных данных. Мы должны убедиться, что электронная почта имеет формат электронной почты и уникальна в таблице users , а пароль подтвержден и содержит не менее 8 символов:

 namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Foundation\Auth\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; class RegisterController extends Controller { public function store(Request $request) { /* Validation */ $request->validate([ 'name' => 'required', 'email' => 'required|email|unique:users', 'password' => 'required|confirmed|min:8', ]); /* Database Insert */ $user = User:;create([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), ]); return back(); } public function create() { return view('auth.register'); } }

Теперь, когда наш ввод проверен, все, что противоречит нашей проверке, вызовет ошибку, которая будет отображаться в форме:

Пример неверного ввода для регистрации
Пример неверного ввода для регистрации

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

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

 namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Providers\RouteServiceProvider; use Illuminate\Foundation\Auth\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; class RegisterController extends Controller { public function store(Request $request) { /* Validation */ $request->validate([ 'name' => 'required', 'email' => 'required|email|unique:users', 'password' => 'required|confirmed|min:8', ]); /* Database Insert */ $user = User:;create([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), ]); Auth::login($user): return redirect(RouteServiceProvider::HOME); } public function create() { return view('auth.register'); } }

И теперь, когда у нас есть зарегистрированный и авторизованный пользователь -n , мы должны убедиться, что он может безопасно выйти из системы.

Laravel предлагает аннулировать сеанс и повторно сгенерировать токен в целях безопасности после выхода из системы. И это именно то, что мы собираемся сделать. Начнем с создания нового маршрута /logout с помощью метода destroy LogoutController :

 use App\Http\Controllers\Auth\RegisterController; use App\Http\Controllers\Auth\LogoutController; use Illuminate\Support\Facades\Route; /* Web Routes Here is where you can register web routes for your application. These routes are loaded by the RrouteServiceProvider with a group which contains the "web" middleware group. Now create something great! */ Route::get('/register', [RegisterController::class, 'create']); Route::post('/register', ['RegisterController::class, 'store']); Route::post('/logout', [Logoutcontroller::class, 'destroy']) ->middleware('auth');

Прохождение выхода через промежуточное ПО «auth» очень важно. Пользователи не должны иметь доступа к маршруту, если они не вошли в систему.

Теперь создайте контроллер, как мы делали это раньше:

 php artisan make:controller Auth/LogoutController -r

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

 namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class LogoutController extends Controller { public function destroy(Request $request) { Auth::logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect('/'); } }

Запоминание пользователей

Большинство, если не все, современные веб-приложения имеют флажок «запомнить меня» в своей форме входа.

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

Когда он действителен, Laravel будет поддерживать аутентификацию пользователя на неопределенный срок или до тех пор, пока он не выйдет из системы вручную. Пользовательская таблица должна включать строку remember_token (поэтому мы повторно генерируем токены), где мы будем хранить наш токен «запомнить меня».

Миграция по умолчанию для пользователей уже включает его.

Прежде всего, вам нужно добавить поле «Запомнить меня» в форму:

форма поля «запомнить меня»
Добавление поля «Запомнить меня из».

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

Если пользователя нужно запомнить, мы войдем в систему и перенаправим его на нашу домашнюю страницу. В противном случае мы выдадим ошибку:

 public function store(Request $request) { $credentials = $request->only('email', 'password'); if (Auth::attempt($credentials, $request->filled('remember'))) { $request->session()->regenerate(); return redirect()->intended('/'); } return back()->withErrors([ 'email' =>

Сброс паролей

Сегодня большинство веб-приложений предоставляют пользователям возможность сбросить свои пароли.

Мы сделаем еще один маршрут для забытого пароля и создадим контроллер, как мы это сделали. Кроме того, мы добавим маршрут для ссылки сброса пароля, который содержит токен для всего процесса:

 Route::post('/forgot-password', [ForgotPasswordLinkController::class, 'store']); Route::post('/forgot-password/{token}', [ForgotPasswordController::class, 'reset']);

Внутри метода store мы возьмем адрес электронной почты из запроса и проверим его, как мы это сделали.

После этого мы можем использовать метод sendResetLink из фасада пароля.

А потом в качестве ответа хотим вернуть статус, если удалось отправить ссылку или ошибки в противном случае:

 namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\Password; class ForgotPasswordLinkController extends Controller { public function store(Request $request) { $request->validate([ 'email' => 'required|email', ]); $status = Password::sendResetLink( $request->only('email'); ); return $status === Password::RESET_LINK_SENT ? back()->with('status', __($status)) : back()->withInput($request->only('email'))->withErrors(['email' => __($status)]); } }

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

Мы получим токен, адрес электронной почты и новый пароль в запросе и проверим их.

После этого мы можем использовать метод сброса из фасада пароля, чтобы позволить Laravel позаботиться обо всем остальном за кулисами.

Мы всегда собираемся хешировать пароль, чтобы сохранить его в безопасности.

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

 namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Password; use Illuminate\Support\Str; class ForgotPasswordController extends Controller { public function store(Request $request) { $request->validate([ 'token' => 'required', 'email' => 'required|email', 'password' => 'required|string|confirmed|min:8', ]); $status = Password::reset( $request->only('email', 'password', 'password_confirmation', 'token'), function ($user) use ($request) { $user->forceFill( 'password' => Hash::make($request->password), 'remember_token' => Str::random(60) ])->save(); } ); return $status == Password::PASSWORD_RESET ? redirect()->route('login')->with('status', __($status)) : back()->withInput($request->only('email'))->withErrors(['email' => __($status)]); } }

Ларавель Бриз

Laravel Breeze — это простая реализация функций аутентификации Laravel: вход в систему, регистрация, сброс пароля, проверка электронной почты и подтверждение пароля. Вы можете использовать его для реализации аутентификации в вашем новом приложении Laravel.

Установка и настройка

После создания приложения Laravel все, что вам нужно сделать, это настроить базу данных, запустить миграцию и установить пакет laravel/breeze через composer:

 composer require laravel/breeze –dev

После этого выполните следующее:

 php artisan breeze:install

Который будет публиковать ваши представления аутентификации, маршруты, контроллеры и другие ресурсы, которые он использует. После этого шага у вас есть полный контроль над всем, что предоставляет Breeze.

Теперь нам нужно отобразить наше приложение во внешнем интерфейсе, поэтому мы установим наши JS-зависимости (которые будут использовать @vite):

 npm install

:

 npm run dev

После этого ссылки для входа и регистрации должны быть на вашей домашней странице, и все должно работать без сбоев.

Ларавель Джетстрим

Laravel Jetstream расширяет Laravel Breeze полезными функциями и другими стеками внешнего интерфейса.

Он обеспечивает вход, регистрацию, проверку электронной почты, двухфакторную аутентификацию, управление сеансами, поддержку API через Sanctum и дополнительное управление командой.

Вы должны выбрать между Livewire и Inertia во внешнем интерфейсе при установке Jetstream. На бэкэнде используется Laravel Fortify, который является независимым от внешнего интерфейса, «безголовым» бэкэндом аутентификации для Laravel.

Установка и настройка

Мы установим его через композитор в нашем проекте Laravel:

 composer require laravel/jetstream

После этого мы запустим команду php artisan jetstream:install [stack] , которая принимает аргументы [stack] Livewire или Inertia . Вы можете передать параметр –team , чтобы включить функцию команд.

Это также установит Pest PHP для тестирования.

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

 npm install npm run dev

Ларавель Укрепить

Laravel Fortify — это внутренняя реализация аутентификации, которая не зависит от внешнего интерфейса. Вам не нужно использовать Laravel Fortify для реализации функций аутентификации Laravel.

Он также используется в стартовых комплектах, таких как Breeze и Jetstream. Вы также можете использовать автономный Fortify, который представляет собой всего лишь внутреннюю реализацию. Если вы используете его отдельно, ваш интерфейс должен вызывать маршруты Fortify.

Установка и настройка

Мы можем установить Fortify через композитор:

 composer require laravel/fortify

Теперь нам нужно опубликовать ресурсы Fortify:

 php artisan vendor:publish –provider="Laravel\Fortify\FortifyServiceProvider"

После этого мы создадим новый каталог app/Actions в дополнение к новому FortifyServiceProvider , файлу конфигурации и миграции базы данных.

Наконец, запустите:

 php artisan migrate

Или:

 php artisan migrate:fresh

И ваш Fortify готов к использованию.

Ларавель светская львица

Laravel включает простую функцию аутентификации пользователей на основе OAuth. Он поддерживает вход в социальные сети через Facebook, Twitter, LinkedIn, Google, Bitbucket, GitHub и GitLab.

Монтаж

Мы можем установить его через композитор:

 composer require laravel/socialite

Настройка и использование

После того, как мы его установили, мы должны добавить учетные данные для поставщика OAuth, который использует наше приложение. Мы добавим их в config/services.php для каждого сервиса.

В конфигурации мы должны сопоставить ключ с предыдущими сервисами. Некоторые из этих ключей включают в себя:

  • фейсбук
  • твиттер (для OAuth 1.0)
  • твиттер-oauth-2 (для OAuth 2.0)
  • связанный
  • Google
  • гитхаб
  • гитлаб
  • битбакет

Одна конфигурация службы может выглядеть так:

 'google' => [ 'client_id' => env("GOOGLE_CLIENT_ID"), 'client_secret' => env("GOOGLE_CLIENT_SECRET"), 'redirect' => "http://example.com/callback-url", ],

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

Для этого действия нам понадобятся два маршрута, один для перенаправления пользователя к провайдеру OAuth:

 use Laravel\Socialite\Facades\Sociliate; Route::get('/auth/redirect', function () { return Socialite:;driver('google')->redirect(); });

И один для обратного вызова от провайдера после аутентификации:

 use Laravel\Socialite\Facades\Socialite; Route:;get('/auht/callback', function () { $user = Socialite:;driver('google')->user(); // Getting the user data $user->token; });

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

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

 use App\Models\User; use Illuminate\Support\Facades\Auth; use Laravel\Socialite\Facades\Socialite; Route::get('/auth/callback', function () { /* Get the user */ $googleUser = Socialite::driver('google')->user(); /* Create the user if it does not exist Update the user if it exists Check for google_id in database */ $user = User::updateOrCreate([ 'google_id' => $googleUser->id, ], [ 'name' => $googleUser->name, 'email' => $googleUser->email, 'google_token' => $googleUser->token, 'google_refresh_token' => $googleUser->refreshToken, ]); /* Authenticates the user using the Auth facade */ Auth::login($user); return redirect('/dashboard'); });

Если мы хотим ограничить области доступа пользователя, мы можем использовать метод scopes , который мы включим в запрос аутентификации. Это объединит все ранее указанные области с указанными.

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

 use Laravel\Socialite\Facades\Socialite; return Socialite::driver('google') ->scopes(['read:user', 'write:user', 'public_repo']) ->redirect(); return Socialite::driver('google') ->setScopes(['read:user', 'public_repo') ->redirect();

Теперь, когда мы знаем все и как получить пользователя после обратного вызова, давайте посмотрим на некоторые данные, которые мы можем из него получить.

Пользователь OAuth1 имеет token и tokenSecret :

 $user = Socialite::driver('google')->user(); $token = $user->token; $tokenSecret = $user->tokenSecret;

OAuth2 предоставляет token , refreshToken и expiresIn :

 $user = Socialite::driver('google')->user(); $token = $user->token; $refreshToken = $user->refreshToken; $expiresIn = $user->expiresIn;

И OAuth1, и OAuth2 предоставляют getId , getNickname , getName , getEmail и getAvatar :

 $user = Socialite::driver('google')->user(); $user->getId(); $user->getNickName(); $user->getName(); $user->getEmail(); $user->getAvatar();

И если мы хотим получить информацию о пользователе из токена (OAuth 2) или токена и секрета (OAuth 1), святилище предоставляет для этого два метода: userFromToken и userFromTokenAndSecret :

 use Laravel\Socialite\Facades\Socialite; $user = Socialite:;driver('google')->userFromToken($token); $user = Socialite::driver('twitter')->userFromTokenAndSecret($token, $secret);

Святилище Ларавеля

Laravel Sanctum — это легкая система аутентификации для одностраничных приложений и мобильных приложений. Он позволяет пользователям создавать несколько токенов API с определенными областями. Эти области определяют разрешенные действия по токену.

Использование

Sanctum можно использовать для выдачи токенов API пользователю без сложностей OAuth. Эти токены обычно имеют длительный срок действия, например годы, но могут быть отозваны и созданы пользователем в любое время.

Установка и настройка

Мы можем установить его через композитор:

 composer require laravel/sanctum

И мы должны опубликовать файлы конфигурации и миграции:

 php artisan vendor:publish –provider="Laravel\Sanctum\SanctumServiceProvider"

Теперь, когда мы создали новые файлы миграции, мы должны их перенести:

 php artisan migrate </code> or <code> php artisan migrate:fresh

Как выпустить токены API

Перед выпуском токенов наша модель User должна использовать трейт Laravel\Sanctum\HasApiTokens :

 use Laravel\Sanctum\HasApiTokens; class User extends Authenticable { use HasApiTokens; }

Когда у нас есть пользователь, мы можем выдать токен, вызвав метод createToken , который возвращает экземпляр Laravel\Sanctum\NewAccessToken .

Мы можем вызвать метод plainTextToken для экземпляра NewAccessToken , чтобы увидеть простое текстовое значение токена SHA-256 .

Советы и рекомендации по аутентификации Laravel

Аннулирование сеансов на других устройствах

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

Эта функция обычно используется, когда пользователь меняет или обновляет свой пароль, и мы хотим аннулировать его сеанс с любого другого устройства.

При наличии фасада Auth этого легко достичь. Учитывая, что маршрут, который мы используем, имеет промежуточное ПО auth и auth.session middleware , мы можем использовать статический метод logoutOtherDevices фасада:

 Route::get('/logout', [LogoutController::class, 'invoke']) ->middleware(['auth', 'auth.session']);
 use Illuminate\Support\Facades\Auth; Auth::logoutOtherDevices($password);

Конфигурация с Auth::routes()

Метод route фасада Auth — это просто помощник для создания всех маршрутов, необходимых для аутентификации пользователя.

Маршруты включают в себя вход в систему (получение, публикация), выход из системы (публикация), регистрацию (получение, публикация) и сброс пароля/электронная почта (получение, публикация).

Когда вы вызываете метод на фасаде, он делает следующее:

 public static fucntion routes(array $options = []) { if (!static::$app->providerIsLoaded(UiServiceProvider::class)) { throw new RuntimeException('In order to use the Auth:;routes() method, please install the laravel/ui package.'); } static::$app->make('router')->auth($options); }

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

 /** Register the typical authentication routes for an application. @param array $options @return void */ public function auth(array $options = []) { // Authentication Routes... $this->get('login', 'Auth\[email protected]')->name('login'); $this->post('login', 'Auth\[email protected]'); $this->post('logout', 'Auth\[email protected]')->name('logout'); // Registration Routes... if ($options['register'] ?? true) { $this->get('register', 'Auth\[email protected]')->name('register'); $this->post('register', 'Auth\[email protected]'); } // Password Reset Routes... if ($options['reset'] ?? true) { $this->resetPassword(); } // Email Verification Routes... if ($options['verify'] ?? false) { $this->emailVerification(); } }

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

Если мы хотим иметь только вход/выход и регистрацию, мы можем передать следующий массив опций:

 $options = ["register" => true, "reset" => false, "verify" => false];

Защита маршрутов и пользовательских охранников

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

 Route::middleware('auth')->get('/user', function (Request $request) { return $request->user(); }); Route::get('/user', function (Request $request) { return $request->user(); })->middleware('auth');

Эта защита гарантирует, что входящие запросы аутентифицируются.

Подтверждение пароля

Для дополнительной безопасности веб-сайта вы часто хотите подтвердить пароль пользователя, прежде чем переходить к какой-либо другой задаче.

Мы должны определить маршрут из представления подтверждения пароля для обработки запроса. Он проверит и перенаправит пользователя к месту назначения. В то же время мы позаботимся о том, чтобы наш пароль отображался подтвержденным в сеансе. По умолчанию пароль необходимо подтверждать каждые три часа, но это можно изменить в файле конфигурации config/auth.php :

 use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Redirect; Route::post('/confirm-password', function (Request $request) { if (!Hash::check($request->password, $request->user()->password)) { return back()->withErrors([ 'password' => ['The provided password does not match our records.'] ]); } $request->session()->passwordConfirmed(); return redirect()->intended(); })->middleware(['auth']);

Аутентифицируемый контракт

Контракт Authenticable, расположенный в Illuminate\Contracts\Auth, определяет схему того, что должен реализовать фасад UserProvider:

 namespace Illuminate\Contracts\Auth; interface Authenticable { public function getAuthIdentifierName(); public function getAuthIdentifier(); public function getAuthPassord(); public function getRememberToken(); public function setRememberToken($value); public function getrememberTokenName(); }

Интерфейс позволяет системе аутентификации работать с любым «пользовательским» классом, который ее реализует.

Это справедливо независимо от того, какие уровни ORM или хранилища используются. По умолчанию в Laravel есть App\Models\User, реализующий этот интерфейс, и это также можно увидеть в конфигурационном файле:

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

События аутентификации

Существует множество событий, которые отправляются в течение всего процесса аутентификации.

В зависимости от ваших целей вы можете прикреплять слушателей к этим событиям в вашем EventServiceProvider .

Слушатели Laravel
Список прослушивателей Laravel, сгенерированный для нашей службы аутентификации.

Быстро создавайте новых пользователей

Быстро создать нового пользователя можно через App\User :

 $user = new App\User(); $user->password = Hash::make('strong_password'); $user->email = '[email protected]'; $user->name = 'Username'; $user->save();

Или через метод create static на пользовательском фасаде:

 User::create([ 'password' => Hash::make('strong-password'), 'email' => '[email protected]', 'name' => 'username' ]);

Краткое содержание

В экосистеме Laravel есть множество стартовых наборов для запуска вашего приложения с системой аутентификации, таких как Breeze и Jetstream. Они легко настраиваются, поскольку код генерируется на нашей стороне, и мы можем изменять его столько, сколько захотим, используя его в качестве плана, если это необходимо.

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

Быстро и эффективно разверните свои приложения Laravel с помощью нашего быстрого хостинга Laravel. Посмотрите свое приложение в действии с помощью бесплатной пробной версии.