Utilice la política para la autorización


En este tutorial queremos configurar la capacidad de los usuarios autorizados para eliminar cualquier respuesta que hayan creado. Además, los invitados o los usuarios no autorizados no deberían poder eliminar ninguna respuesta. Entonces, como de costumbre, configuraremos un par de pruebas para admitir estas nuevas funciones. Además, aprovecharemos un nuevo objeto de política para determinar si algún usuario en particular está autorizado a eliminar una respuesta determinada. Por último, actualizaremos el lado de la vista para mostrar la opción de eliminar una respuesta de los usuarios autorizados.


Prueba de usuarios no autorizados

Primero, abramos la clase de prueba ParticipateInForumTest.php que tenemos y agreguemos una nueva prueba. Podemos llamarlo test_unauthorized_users_can_not_delete_replies (). La lógica es bastante simple. Dado que hay una respuesta y un invitado intenta eliminar esa respuesta, el usuario debe ser redirigido a la página de inicio de sesión. Aquí hay una primera oportunidad de esa prueba.

Ejecutar la prueba nos da una NotFoundHttpException que generalmente es una ruta faltante.

vagrant @ homestead: ~ / Code / forumio $ phpunit --filter test_unauthorized_users_can_not_delete_replies
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

E 1/1 (100%)

Tiempo: 849 ms, memoria: 8,00 MB

Hubo 1 error:

1) Tests \ Feature \ ParticipateInForumTest :: test_unauthorized_users_can_not_delete_replies
Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException: DELETE http: // localhost / replies / 1

Agregar la ruta

Registramos una solicitud de eliminación en / replies / {reply} que activará el método destroy () en el RepliesController.


Modificar la prueba

Supongamos que un usuario ha iniciado sesión. En este caso, la prueba podría verse así.

Si ejecutamos la prueba, ahora obtendremos una BadMethodCallException. Esto se debe a que todavía necesitamos crear el método destroy () en el RepliesController.

vagrant @ homestead: ~ / Code / forumio $ phpunit --filter test_unauthorized_users_can_not_delete_replies
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

E 1/1 (100%)

Tiempo: 821 ms, memoria: 8,00 MB

Hubo 1 error:

1) Tests \ Feature \ ParticipateInForumTest :: test_unauthorized_users_can_not_delete_replies
BadMethodCallException: el método [destroy] no existe en [App \ Http \ Controllers \ RepliesController].

Añadiendo el método destroy ()

Abra RepliesController.php y podemos agregar el código para completar nuestro objetivo.

Ahora podemos ejecutar la prueba una vez más.

vagrant @ homestead: ~ / Code / forumio $ phpunit --filter test_unauthorized_users_can_not_delete_replies
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

F 1/1 (100%)

Tiempo: 920 ms, memoria: 10,00 MB

Hubo 1 falla:

1) Tests \ Feature \ ParticipateInForumTest :: test_unauthorized_users_can_not_delete_replies
Código de estado esperado 403 pero recibido 302.
No se pudo afirmar que lo falso es verdadero.

/home/vagrant/Code/forumio/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:78
/home/vagrant/Code/forumio/tests/Feature/ParticipateInForumTest.php:53

¡FALLOS!
Pruebas: 1, afirmaciones: 1, fallos: 1.

Lo que está sucediendo ahora es que durante la prueba, la respuesta se está eliminando pero no hemos aplicado ninguna autorización. Tal como está ahora en la prueba, el usuario inicia sesión y luego intenta eliminar una respuesta que él o ella no creó. La respuesta debería ser un estado prohibido de 403. Podemos habilitar esto usando un nuevo objeto de política . Haremos esto en un momento, pero primero agreguemos otra prueba.


Prueba de usuarios autorizados

La prueba para usuarios autorizados se verá así.


Configurar una nueva política

Agreguemos ese nuevo objeto de política para determinar si un usuario puede eliminar una respuesta o no. Empezaremos construyéndolo así.

vagrant @ homestead: ~ / Code / forumio $ php artisan make: policy ReplyPolicy
Política creada con éxito.

Ahora simplemente agregamos el método de actualización donde especificamos que para que un usuario pueda eliminar una respuesta, su identificación de usuario debe coincidir con la identificación de usuario que se encuentra en la respuesta en cuestión. Por supuesto, esto significa que el hilo les pertenece, por lo que pueden eliminarlo.

Una vez completado, asegúrese de registrar la nueva política en AuthServiceProvider. La línea resaltada muestra nuestra adición para el registro de la política de respuesta que acabamos de crear. Tal vez recuerde que cuando creamos una política de subprocesos en un tutorial anterior, el registro de esa política está justo encima de la línea resaltada.

Ahora puede autorizar una actualización de la respuesta en el método destroy () del RepliesController como lo hacemos aquí.

Nuestras pruebas finales para estas funciones son las siguientes:

Ejecutar el conjunto completo de esta clase de prueba confirma que todo está funcionando.

vagrant @ homestead: ~ / Code / forumio $ phpunit --filter ParticipateInForumTest
PHPUnit 6.5.5 por Sebastian Bergmann y colaboradores.

..... 5/5 (100%)

Tiempo: 1,88 segundos, memoria: 14,00 MB

OK (5 pruebas, 10 afirmaciones)

Agregar el botón Eliminar en el navegador

Ok, parece que toda la funcionalidad está funcionando bien para los usuarios autorizados y no autorizados con respecto a la eliminación de respuestas. Podemos actualizar la vista reply.blade.php para permitir eso. A continuación, se resalta el marcado para proporcionar el botón de eliminar. Además, dado que usamos políticas, podemos hacer uso de esa útil directiva @can para mostrar el botón solo a un usuario que está autorizado a eliminar una respuesta específica. Por lo tanto, los invitados nunca verán un botón de eliminación, pero los usuarios autorizados verán un botón de eliminación para sus propias respuestas.

El usuario que inició sesión ahora ve un botón de eliminar para su respuesta.
ejemplo de directiva laravel can

Después de hacer clic en el botón Eliminar, podemos ver que la respuesta se ha ido. Además, tenga en cuenta que no hay respuestas de este usuario. Por lo tanto, ya ni siquiera vemos el botón de eliminar en las respuestas restantes al hilo.
no se ve el botón de borrar


Verifique la autorización con políticas antes de eliminar el resumen de la función

Por lo tanto, aquí se proporcionó un ejemplo bastante sencillo del uso de un objeto de política para asegurarse de que un usuario esté autorizado a eliminar una respuesta a un hilo. Ya habíamos configurado un objeto de política durante el tutorial en el que configuramos la capacidad de eliminar hilos, por lo que esto fue un poco de revisión, pero aún así fue útil para reforzar nuestro aprendizaje.