Autentizace

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.

Databázová příprava

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.

Začátek

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.

Routing

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

Pohledy

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.

Autentizace

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.

Vlastní přesměrování

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';
}

Vlastní pole

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';
}

Validace

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í

Získání přihlášeného uživatele

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
    }
}

Kontrola přihlášeného uživatele

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
}

Přesměrování nepřihlášeného uživatele

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');
}

Manuální přihlášení uživatelů

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

Přihlášení uživatele podle jeho ID

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

Přihlášení uživatele jen jednou

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)) {
    //
}

Odhlášení

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();