Autorizimi

Laravel ofron një mënyrë relativisht të thjeshtë për autorizimin e veprimeve të përdoruesit ndaj një resursi të caktuar. Kjo realizohet me dy mënyra: gates dhe policies.

Gates ofron një teknikë të thjeshtë që bazohet në Closure, ndërsa Policies mundëson grupimin e logjikës së qasjes rreth një modeli apo resursi.

Ndonëse ofrojnë funksionalitet të njëjtë, nuk është e thënë të përcaktohemi për njërën mënyrë apo tjetrën. Në një aplikacion, mund t'i kombinojmë të dy mënyrat, sipas nevojës.

Gates janë më të përshtatshme për veprimet që nuk janë të ndërlidhura me ndonjë model apo resurs, siç është për shembull hapja e panelit të administratorit. Policies janë më të përshtatshme për autorizimin e një veprimi që ka lidhshmëri me një model apo resurs.

Gates

Gates janë Closure që determinojnë nëse përdoruesi është i autorizar për kryerjen e një veprimit të caktuar. Zakonisht definohen në klasën App\Providers\AuthServiceProvider duke përdorur fasadën Gate. "Gates" gjithmonë e pranon një instancë të modelit User si argument të parë, dhe mund të pranojë edhe argumente të tjera opsionale siç janë modelet relevante të Eloquent.

public function boot()
{
    $this->registerPolicies();

    Gate::define('update-post', function ($user, $post) {
        return $user->id == $post->user_id;
    });
}

Gates mund të definohen edhe në formën Class@method si në rastin e kontrollerëve.

public function boot()
{
    $this->registerPolicies();

    Gate::define('update-post', 'PostPolicy@update');
}

Resource Gates

Ne mund të definojmë mundësi të shumëfishta të Gates duke përdorur metodën resource.

Gate::resource('posts', 'PostPolicy'); 

Kjo është identike me definimin manual të definicioneve vijuese të Gate:

Gate::define('posts.view', 'PostPolicy@view'); Gate::define('posts.create', 'PostPolicy@create'); Gate::define('posts.update', 'PostPolicy@update'); Gate::define('posts.delete', 'PostPolicy@delete');

Në mënyrën standarde, krijohen mundësitë creat, view, update, dhe delete, por mund të shtojmë edhe metoda të tjera sipas nevojës, duke vendosur si argument të tretë një varg asociativ, ky çelësi është emërtimi i mundësisë, ndërsa vlera - emërtimi i metodës.

Gate::resource('posts', 'PostPolicy', [ 'image' => 'updateImage', 'photo' => 'updatePhoto', ]);

Me këtë u krijuar mundësitë posts.image për metodën updateImage dhe posts.photo, për metodën updatePhoto.

Autorizimi i veprimeve

Për autorizimin e një veprimi duke i përdorur "Gates", duhet të përdoren metodat allows për lejim apo denies për ndalesë. Këtyre metodave nuk ka nevojë t'i përillet objekti i përdoruesit të autentikuar sepse ai objekt lexohet automatikisht drejt e në Closure.

if (Gate::allows('update-post', $post)) {
    // The current user can update the post...
}

if (Gate::denies('update-post', $post)) {
    // The current user can't update the post...
}

Nëse dëshirojmë të determinojmë nëse një përdorues i caktuar është i autorizuar për ta kryer një veprim të caktuar, mund ta përdorim metodën forUser në fasadën Gate .

if (Gate::forUser($user)->allows('update-post', $post)) {
    // The user can update the post...
}

if (Gate::forUser($user)->denies('update-post', $post)) {
    // The user can't update the post...
}

Policies

Gjenerimi i policies

"Policies" janë klasa që e organizojnë logjikën e autorizimi rreth një metode apo resursi të caktuar. Në një blog mund ta keni modelin Post dhe PostPolicy korrespondues që bën autorizimin e veprimeve të përdorues siç janë krijimi apo përditësimi i postimeve.

Një "policy" mund të gjenerohet me artisan dhe vendoset në app/Policies.

php artisan make:policy PostPolicy

Me këtë krijohet një "policy" klasë e zbrazët. Për gjenerimin e një klase me metodat bazike "CRUD" brenda klasës, duhet të specifikohet parametri --modelsi vijon:

php artisan make:policy PostPolicy --model=Post

All policies are resolved via the Laravel service container, allowing you to type-hint any needed dependencies in the policy's constructor to have them automatically injected.

Të gjitha "policies" zgjidhen nëpërmes "service container" të Laravel, duke mundësuar "type-hint" për "dependencies" së nevojitura në konstruktorin e "policy" në mënyrë që të injektohen automatikisht.

Regjistrimi i "policies"

Pas krijimit, një "policy" duhet të regjistrohet. Klasa AuthServiceProvider e përmban një veti policies i cili bën ndërlidhjen e modeleve të Eloquent me "policies" korresponduese. Regjistrimi i një "policy" do ta udhëzojë Laravelin në atë se cilin "policy" ta përdorë gjatë autorizimiz zë veprimeve ndaj një modeli.

namespace App\Providers;

use App\Post;
use App\Policies\PostPolicy;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    protected $policies = [
        Post::class => PostPolicy::class,
];

    public function boot()
    {
        $this->registerPolicies();
        //
    }
}

Shkrimi i "policies"

Metodat e "policy"

Pas regjistrimit të një "policy", mund të shtohen metodat për çdo veprim që autorizohet. Për shembull, ta definojmë metodën updatePostPolicy që determinon nëse përdoruesi (modeli User) i caktuar mund ta përditësojë postimin (modeli Post) e caktuar.

Metoda update do t'i pranojë instancat e modeleve User dhe Post si argumente, dhe si vlerë duhet të kthejë true ose false me çka tregohet se a është ai përdorues i autorizuar për ta përditësuar postimin e caktuar. Këtë do ta bëjnë duhet verifikuar nëse id e përdoruesit pëputhet me user_id të postimit.

namespace App\Policies;

use App\User;
use App\Post;

class PostPolicy
{
    public function update(User $user, Post $post)
    {
        return $user->id === $post->user_id;
    }
}

Mund të definojmë metoda shtesë për veprime të tjera që duhet të autorizohen.