Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Proteger: actualizar

11/23
Recursos

Aportes 7

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

El tema de la validación lo puedes realizar utilizando los Form Request de la siguiente forma:

public function authorize()
    {
        $repository = Repository::find($this->route('repository'));

        return $repository && $this->user()->can('update', $repository);
    }

Más info: Authorizing form request.

De esta forma evitamos tener toda esta lógica en nuestros controladores y aprovechamos al máximo los form request validators.
Saludos!.

Otra manera de acceder al objeto usuario que está haciendo el request es con Auth::user() donde puedes encadenar cualquier método proveído que exista, claro está.

php artisan test --filter test_update_policy

Modificaciones:

  • tests/Feature/Http/Controllers/RepositoryControllerTest.php
    • test_update_policy
    • test_update
  • app/Http/Controllers/RepositoryController.php

Tests:

  • Crear usuario y repositorio(diferente user_id), intentar actualizar el repositorio siendo otro usuario(no dueño), retorna status 403
  • Actualizar test anterior (usuario dueño de repo)

Se me ocurre que también podríamos agregar un middleware que se encargue específicamente de esta validación 🤔 Son ideas alternativas que podemos usar al momento de solucionar un problema, usualmente suele ser una buena práctica hacer validaciones en los middlewares antes de llegar a los controladores 😄

Una forma que uso es crear un policy directamente en este caso

php artisan make:policy RepositoryPolicy --model=Repository

en la carpeta app/policies encontraremos nuestro policies nos sirven para proteger las vistas y metodos en este caso vamos al de update

    public function update(User $user, Repository $repository)
    {
        return $user->id === $repository->user_id;
    }

nos dirigimos al controlador RepositoryController y vamos a nuestro metodo update y en la primera linea colocamos

$this->authorize('update', $repository);

es mas largo pero los archivos policies sirven para todos los metodos los controladores y al final nos queda mas limpio nuestro controlador

Dejo aqui mi commit de la clase

https://github.com/jlbousing/practica-tdd/commit/5d6ff7ab5212c951777e4867ed12cc0f67f22eae

Otra cosa, tambien se pudo haber utilizado Auth::user()->id para sacar el usuario autenticado. Sin embargo, me gusta mas como Italo lo hizo.

En el caso concreto de esta clase el código del authorize quedaría de la siguiente manera:

public function authorize()
    {
        return $this->user()->id == $this->repository->user_id;
    }

Recordemos que según la documentación si nuestra validación retorna falso, nos retorna 403:

If the authorize method returns false, an HTTP response with a 403 status code will automatically be returned and your controller method will not execute.

Saludos!.