Buscar..


Introducción

Laravel proporciona una forma sencilla de autorizar acciones de usuario en recursos específicos. Con la Autorización, puede permitir selectivamente que los usuarios accedan a ciertos recursos y denegar el acceso a otros. Laravel proporciona una API simple para administrar las autorizaciones de los usuarios mediante el uso de Gates y Policies . Gates proporciona un enfoque simple basado en el cierre de la autorización mediante el AuthServiceProvider mientras que las Policies permiten organizar la lógica de autorización en torno a modelos que usan clases.

Usando puertas

Gates son cierres que determinan si un usuario puede realizar una determinada acción en un recurso. Gates se definen normalmente en el método de arranque de AuthServiceProvider y se nombran de forma sucinta para reflejar lo que está haciendo. Un ejemplo de una puerta que solo permite a los usuarios premium ver algunos contenidos se verá así:

Gate::define('view-content', function ($user, $content){
    return $user->isSubscribedTo($content->id);
});

Una Gate siempre recibe una instancia de usuario como primer argumento, no necesita pasarla al usar la puerta y, opcionalmente, puede recibir argumentos adicionales, como el modelo elocuente en cuestión.

Autorizando acciones con puertas

Para usar el ejemplo anterior en una plantilla blade para ocultar el contenido del usuario, normalmente haría algo como esto:

@can('view-content', $content)
 <! -- content here -->
@endcan

Para evitar completamente la navegación al contenido, puede hacer lo siguiente en su controlador:

if(Gate::allows('view-content', $content)){
    /* user can view the content */
}

        OR

if(Gate::denies('view-content', $content)){
    /* user cannot view content */
}

Nota: No es necesario que pase el usuario autenticado actualmente a estos métodos, Laravel se encarga de eso por usted.

Políticas

Las políticas son clases que lo ayudan a organizar la lógica de autorización en torno a un recurso modelo. Usando nuestro ejemplo anterior, podríamos tener una ContentPolicy que administra el acceso de los usuarios al modelo de Content .

Para hacer ContentPolicy , laravel proporciona un comando artesanal. Simplemente correr

php artisan make:policy ContentPolicy

Esto creará una clase de política vacía y la colocará en la app/Policies carpeta de app/Policies . Si la carpeta no existe, Laravel la creará y colocará la clase dentro.

Una vez creadas, las políticas deben registrarse para ayudar a Laravel a saber qué políticas usar cuando se autorizan acciones en modelos. El AuthServiceProvider de Laravel, que viene con todas las instalaciones nuevas de Laravel, tiene una propiedad de políticas que asigna sus modelos elocuentes a sus políticas de autorización. Todo lo que necesitas hacer agrega la asignación a la matriz.

protected $policies = [
    Content::class => ContentPolicy::class,
 ];

Políticas de escritura

Policies escritura sigue casi el mismo patrón que escribir Gates . La puerta de permisos de contenido puede reescribirse como una Política como esta:

function view($user, $content)
{
    return $user->isSubscribedTo($content->id);
}

Las políticas pueden contener más métodos según sea necesario para atender todos los casos de autorización de un modelo.

Autorizar acciones con políticas

A través del modelo de usuario

El modelo de usuario de Laravel contiene dos métodos que ayudan con las autorizaciones utilizando Policies ; can y can't Estos dos pueden usarse para determinar si un usuario tiene autorización o no en un modelo, respectivamente.

Para verificar si un usuario puede ver un contenido o no, puede hacer lo siguiente:

if($user->can('view', $content)){
    /* user can view content */
}

        OR

if($user->cant('view', $content)){
    /* user cannot view content */
}

Via Middleware

Route::get('/contents/{id}, function(Content $content){
    /* user can view content */
})->middleware('can:view,content');

A través de los controladores

Laravel proporciona un método auxiliar, denominado authorize que toma el nombre de la política y el modelo asociado como argumentos, y autoriza la acción según su lógica de autorización o niega la acción y lanza una excepción de AuthorizationException que el controlador de excepciones de Laravel convierte a un 403 HTTP response

pubic function show($id)
{
    $content = Content::find($id);

    $this->authorize('view', $content);
        
    /* user can view content */
}


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow