Laravel nabízí velmi jednoduše implementaci autentizace (přihlášení/ověření uživatele). Prakticky všechno už je předem připravené a konfigurační soubor najdete v config/auth.php
, kde je několik dobře popsaných možností jak změnit chování autentizačních služeb.
Autentizace v Laravelu je složena z "guards" a "providers". Guards, česky by se dalo přeložit jako strážci, definují, jak jsou uživatele kontrolováni při každém požadavku. Například guard session
, který udržuje stav pomocí session a cookies.
Providers, česky poskytovatelé, definují jak jsou uživatelé získávání z perzistentního uložiště (např. databáze). Pro získávání uživatelů Laravel využívá Eloquentu a databázového query builderu. Nicméně je možné si definovat vlastní providery podle potřeby.
Laravel defaultně obsahuje Eloquent model App\User
v adresáři app
a je využíván Eloquentem. Když vytváříte databázové schéma pro model App\User
, je potřeba myslet na to, že sloupec pro heslo potřebuje minimálně 60 znaků, nicméně defaultních 255 znaků pro stringový sloupec je vhodnější. Stejně tak je potřeba zajistit, aby tabulka users
(nebo jiná definovaná), obsahovala stringový sloupec remember_token
o velikosti 100 znaků. Tento sloupec je pak využíván k uložení tokenu pro uživatele, kteří si zaškrtnou možnost "Zapamatuj si mě" při přihlašování do aplikace.
Framework nicméně všechno toto již defaultně nabízí v migracích a není tak potřeba nic dalšího připravovat, avšak v případě potřeby to lze bez problémů přizpůsobit vlastním potřebám.
Laravel obsahuje několik předpřipravených autentizačních controllerů, které jsou jmenném prostoru App\Http\Controllers\Auth
. RegisterController
zajišťuje registraci nových uživatelů, LoginController
obsahuje autentizaci, ForgotPasswordController
nabízí emailové odkazy pro obnovení hesel, a ResetPasswordController
obsahuje logiku pro samotné resetování hesel. Každý z těchto controllerů zahrnuje trait, který obsahuje jejich nezbytné metody. Ve většině případů tyto controllery nebudete potřebovat měnit.
Balíček laravel/ui
nabízí rychlé řešení všech rout a pohledů, které potřebujete pro autentizaci. Zavolat stačí pouze tyto dva příkazy:
composer require laravel/ui --dev
php artisan ui vue --auth
Tyto příkazy by se měly volat pouze na čerstvě vytvořené aplikace. Po vykonání příkazů se vytvoří layout, registrační a přihlašovací pohledy a routy pro autentizaci. Stejně tak se vytvoří HomeController
, který se zavolá po přihlášení uživatele.
Pokud začínáte s novým projektem a chcete tam mít rovnou připravenou celou autentizaci, stačí vytvořit nový projekt s direktivou --auth
:
laravel new blog --auth
Jak jsem popisoval v předešlé sekci, příkaz nám vytvořil všechny potřebné autentizační pohledy v adresáři resources/views/auth
. Díky příkazu ui
se také vytvořil základní layout app.blade.php
v resources/views/layouts
. Všechny tyto pohledy obsahují CSS framework Bootstrap, nicméně si je můžete přizpůsobit dle libosti.
Díky tomu, že máme připravené routy a pohledy, můžeme rovnou registrovat a přihlašovat nové uživatele do naší aplikace. Protože autentizační controllery již obsahují logiku skrze jejich traity, můžeme přihlašovat již existující uživatele a ukládat nové uživatele do databáze.
Jakmile je uživatel úspěšně přihlášen, tak je defaultně přesměrován na /home
. Tato URI je definována jako proměnná redirectTo
ve třídách LoginController
, RegisterController
, ResetPasswordController
a VerificationController
:
protected $redirectTo = '/';
Pokud při přesměrování potřebujete použít nějakou větší logiku, pak namísto proměnné můžete rovnou využít přepsáním metody redirectTo()
, která má i přednost před proměnnou:
protected function redirectTo()
{
return '/vlastni-cesta';
}
Laravel defaultně využívá pro přihlašování pole email
. Pokud to chcete změnit, můžete využít metody username()
ve třídě LoginController
:
public function username()
{
return 'username';
}
Pro úpravu formulářových polí, které jsou vyžadovány pro registraci nového uživatele nebo úpravu logiky, jak jsou noví uživatelé ukládání do databáze, můžeme využít třídy RegisterController
. Tento controller je zodpovědný za validaci a vytváření nových uživatelů v naší aplikaci.
Metoda validator
obsahuje validační pravidla pro nové uživatele. Ty si můžete upravit dle libosti.
Metoda create
je pak zodpovědná za vytváření nových App\User
záznamů do databáze pomocí Eloquent ORM. Tuto metodu si také můžete upravit podle vlastních potřeb.
Přihlášeného uživatele můžeme získat pomocí fasády Auth
:
use Illuminate\Support\Facades\Auth;
// Aktualne prihlaseny uzivatel
$user = Auth::user();
// ID aktualne prihlaseneho uzivatele
$id = Auth::id();
Případně můžeme přihlášeného uživatele získat z instance třídy Illuminate\Http\Request
:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ProfileController extends Controller
{
/**
* Aktualizace profilu uzivatele
*
* @param Request $request
* @return Response
*/
public function update(Request $request)
{
// $request->user() vraci instanci prihlaseneho uzivatele
}
}
Pro kontrolu, jestli je uživatel přihlášen, můžeme využít metody check
, která vrací boolean hodnotu true
, pokud je uživatel přihlášen:
use Illuminate\Support\Facades\Auth;
if (Auth::check()) {
// Uzivatel je prihlasen
}
Pokud middleware auth
zjistí, že se jedná o nepřihlášeného uživatele, automaticky ho přesměruje na routu login
. Tuto routu můžete upravit v metodě redirectTo
v souboru app/Http/Middleware/Authenticate.php
:
/**
* Cesta kam ma byt host presmerovan
*
* @param \Illuminate\Http\Request $request
* @return string
*/
protected function redirectTo($request)
{
return route('login');
}
Pokud potřebujete do aplikace přihlásit již existujícího uživatele, pak můžete využít metody login
, avšak daný objekt musí být implementace třídy Illuminate\Contracts\Auth\Authenticatable
. Výchozí model App\User
v Laravelu tuto třídu jíž implementuje:
Auth::login($user);
Pro přihlášení uživatele do aplikace pomocí jeho ID lze využít metodu loginUsingId
. Tato metoda přímá jako parametr primární klíč uživatele, kterého chcete přihlásit:
Auth::loginUsingId(1);
Metodu once
můžete použít pro přihlášení uživatele do aplikace jen pro aktuální HTTP požadavek. Nenastaví se žádné sessions ani cookies, což je vhodné například při bezestavovém API požadavku:
if (Auth::once($credentials)) {
//
}
Pro manuální odhlášení uživatelů z naší aplikace využijeme metodu logout
v Auth
fasádě. Tato metoda vymaže přihlašovací informace z uživatelské sessions:
use Illuminate\Support\Facades\Auth;
Auth::logout();