Mostrando entradas con la etiqueta Policy. Mostrar todas las entradas
Mostrando entradas con la etiqueta Policy. Mostrar todas las entradas

Aplicar una policy a un componente de Livewire

El policy se define como siempre pero en el componente Livewire:
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
...
use AuthorizesRequests;
...
$this->authorize('esSuyo', $this->order);

Policy

Los policy devuelven un booleano para autorizar o no autorizar seguir con la acción.
php artisan make:policy PostPolicy
En app\Policies\PostPolicy.php:
SIEMPRE a todos los métodos hay que pasarle el método User, si queremos un policy que no se necesite estar autorizado entonces pasarlo como opcional con una ?:
public function estaPublicado(?User $user, Post $post) { ... }
Ejemplo:
public function esAutorDelPost(User $user, Post $post) {
if ($user->id == $post->user_id) {
return true;
}
else {
return false;
}
}

Y en nuestro controller
$this->authorize('esAutorDelPost', $post);
// Si ese Post no pertenece a ese user ya no deja seguir ejecutando el resto del método.

Restringir accesos a controllers y views con un policy

php artisan make:policy PostPolicy

En AuthServiceProvider.php añadirlo:
protected $policies = [
        // 'App\Model' => 'App\Policies\ModelPolicy',
        Entry::class => EntryPolicy::class
    ];

En EntryPolicy.php:
public function update(User $user, Entry $entry) {
        return $user->id === $entry->user_id; // dará true o false
}

Y ahora ya solo llamar a ese policie desde una vista:
@can ('update',$entry) <!-- por defecto es el user logueado -->
...
@endcan

desde un controller:
$this->authorize('update',$entry); // el id_user coge el user logueado por defecto

O desde routes/web.php con un middleware:
Route::get('/entries/{entry}/edit', 'EntryController@edit')->middleware('can:update,entry');