Ricerca…
introduzione
Laravel fornisce un modo semplice per autorizzare azioni dell'utente su risorse specifiche. Con Autorizzazione, è possibile consentire in modo selettivo agli utenti l'accesso a determinate risorse negando l'accesso ad altri. Laravel fornisce una semplice API per la gestione delle autorizzazioni degli utenti utilizzando Gates
e Policies
. Gates
forniscono un approccio basato sulla chiusura semplice all'autorizzazione che utilizza AuthServiceProvider
mentre le Policies
consentono di organizzare la logica di autorizzazione intorno ai modelli utilizzando le classi.
Usando i cancelli
Gates
sono chiusure che determinano se un utente è autorizzato a eseguire una determinata azione su una risorsa. Gates
sono in genere definite nel metodo di avvio di AuthServiceProvider
e succintamente nominate per riflettere su ciò che sta facendo. Un esempio di gate che consente solo agli utenti premium di visualizzare alcuni contenuti sarà simile a questo:
Gate::define('view-content', function ($user, $content){
return $user->isSubscribedTo($content->id);
});
A Gate
riceve sempre un'istanza utente come primo argomento, non è necessario passarlo quando si utilizza il gate e può facoltativamente ricevere argomenti aggiuntivi come il modello eloquente in questione.
Autorizzazione di azioni con porte
Per utilizzare l'esempio precedente su un modello blade per nascondere il contenuto dall'utente, in genere si dovrebbe fare qualcosa del genere:
@can('view-content', $content)
<! -- content here -->
@endcan
Per impedire completamente la navigazione verso il contenuto, puoi fare quanto segue nel tuo controller:
if(Gate::allows('view-content', $content)){
/* user can view the content */
}
OR
if(Gate::denies('view-content', $content)){
/* user cannot view content */
}
Nota: non è necessario passare a questo metodo l'utente attualmente autenticato, Laravel si occupa di ciò per te.
Politiche
Le politiche sono classi che consentono di organizzare la logica di autorizzazione attorno a una risorsa del modello. Utilizzando il nostro esempio precedente, potremmo avere una ContentPolicy
che gestisce l'accesso degli utenti al modello di Content
.
Per rendere ContentPolicy
, laravel fornisce un comando artigiano. Semplicemente corri
php artisan make:policy ContentPolicy
Questo renderà una classe politica vuota e verrà inserita nella cartella app/Policies
. Se la cartella non esiste, Laravel la creerà e inserirà la classe all'interno.
Una volta creati, è necessario registrare le politiche per aiutare Laravel a sapere quali politiche utilizzare per autorizzare le azioni sui modelli. L'AuthServiceProvider di AuthServiceProvider
, fornito con tutte le nuove installazioni di Laravel, ha una proprietà policy che associa i modelli eloquenti alle loro politiche di autorizzazione. Tutto ciò che devi fare è aggiungere la mappatura all'array.
protected $policies = [
Content::class => ContentPolicy::class,
];
Politiche di scrittura
Le Policies
Scrittura seguono lo stesso schema della scrittura di Gates
. Il gate di autorizzazione del contenuto può essere riscritto come un criterio come questo:
function view($user, $content)
{
return $user->isSubscribedTo($content->id);
}
Le politiche possono contenere più metodi necessari per occuparsi di tutti i casi di autorizzazione per un modello.
Autorizzazione delle azioni con le politiche
Via il modello utente
Il modello utente Laravel contiene due metodi che aiutano con le autorizzazioni che utilizzano le Policies
; can
e can't
. Questi due possono essere usati per determinare se un utente ha o meno un'autorizzazione su un modello.
Per verificare se un utente può visualizzare o meno un contenuto, puoi fare quanto segue:
if($user->can('view', $content)){
/* user can view content */
}
OR
if($user->cant('view', $content)){
/* user cannot view content */
}
Tramite middleware
Route::get('/contents/{id}, function(Content $content){
/* user can view content */
})->middleware('can:view,content');
Via controllori
Laravel fornisce un metodo di supporto, chiamato authorize
che accetta il nome della politica e il modello associato come argomenti, e autorizza l'azione in base alla propria logica di autorizzazione o nega l'azione e lancia una AuthorizationException
che il gestore di eccezioni di Laravel converte in un 403 HTTP response
.
pubic function show($id)
{
$content = Content::find($id);
$this->authorize('view', $content);
/* user can view content */
}