Políticas vs Spatie en Laravel (Roles y Permisos) Cuando usar? ChatGTP Responde...
Hola por aquí quería hacer una rápida aclaratoria espero que sea rápida sobre cuando emplear Spatie y cuando emplear las políticas en Laravel obviamente ya yo con esto estoy dando por hecho que entiendo de lo que estoy hablando pero de igual manera te lo voy diciendo rápidamente
Sistemas de Roles y Permisos - Spatie
Spatie básicamente es un sistema normalito que tenemos en cualquier otro tipo de aplicacion frameworks etcétera que nos permite manejar por un lado lo que son los permisos y los roles es decir tenemos un usuario y le podemos asignar roles y permisos por lo tanto entiendo o no voy a explicar ahorita puedes buscar muchísima información sobre eso en internet es decir en internet hay muchísima información sobre eso en caso de que no lo domines pero es básicamente eso mientras que las políticas es un sistema un poquito más casero en la cual también pudiéramos simularlo obviamente aquí puedes ver que le pregunté a ChatGTP cuándo emplear uno o cuándo emplear otro queé es lo que él me recomienda y por aquí vamos a analizar un poquito la respuesta y ahí aprovechamos y también explicamos un poquito la política que no lo he hecho y vemos ahí cuando emplear una u el otro comenzando por spatie que yo creo que es el como quien dice que se puede entender más fácilmente spatie básicamente es un sistema de roles y permisos como te comentaba antes por lo tanto qué demonios es esto
Ejemplo de sistema de Roles y Permisos
Por ejemplo suponte que tenemos una aplicación tipo blog es decir con su editor con el CRUD básico listado la parte de edición creación y eliminar tenemos usuarios administradores editores y demás todo eso tú lo puedes configurar a gusto dependiendo de la lógica de tu aplicación la lógica de negocios pero para mantenerlo sencillo tú vas a tener algunos usuarios que solamente pueden editar por lo tanto en base a eso tú vas a tener permisos para poder crear editar elinar y por supuesto ver el listado o el detalle para un usuario editor le puedes asignar los permisos de edición ya que solamente quieres que edite suponiendo que no quieres que cree pero si quieres que cree se lo asignas perfectamente y el de listado porque obviamente tiene que ver el detalle y básicamente sería eso y el usuario administrador o super administrador todo depende como lo manejes va a ver todo lo que son los el resto del CRUD que te comentaba permisos para editar crear eliminar y el listado y a partir de ahí tú puedes crearlo y mezclarlo como tú quieras pero es básicamente eso
Es una forma en la cual tú puedes indicar que usuarios pueden hacer una operación y que usuarios no pueden hacer una operación
Cómo se traduce todo esto en la práctica básicamente son condicionales funciones pero a la final son condicionales hay algunas funciones que como quien dice hacen el intermediario de una de una un condicional pero todo estos son condicionales:
$user->assignRole('admin');
$user->givePermissionTo('edit articles');
if ($user->can('edit articles')) {
// Acceso permitido
}
Entonces aquí tenemos como te comentaba una reutilización muy fácil de los permisos ya que tienes el permiso y se lo puedes asignar a los usuarios y básicamente así funciona spatie y en Django por ejemplo también tenemos un sistema similar solo que ya este viene de de base lo que comentan aquí fácil integración con cualquier cosa en este caso las políticas y aquí tienes un ejemplo de esto tenemos un usuario autenticado lo que tú quieras le asignas un rol y al rol le puedes dar algunos permisos por supuesto por detrás esto es un tema bastante flexible por detrás ya automáticamente le puedes asignar a ese rol algunos permisos para que no lo tengas que hacer así manualmente o también de manera independiente y esto ya es en spatie le puedes asignar los permisos tal cual estás viendo en pantalla y a partir de de aquí condicionales hay como 1000 formas de hacer esto pero esto viene siendo lo más sencillo en la cual se pregunta si este usuario tiene el permiso mencionado acá tal cual puedes ver esto es una etiqueta:
can('edit articles')
Y simplemente le preguntas y poco más entonces qué demonios es la política si ya tenemos eso por allí arriba bastante excelente aquí tal cual indica la política Es algo similar a eso pero un poco más genérico eso ya es un poco término mío ya que usualmente empleamos las políticas cuando no necesitamos un sistema complejo tal cual indican por acá de roles y permisos es decir tenemos es algo sencillito y ahorita te voy a dar un buen ejemplo de esto
Uso de las Politicas
No quieres realmente manejar un sistema para los post de editores y demás o simplemente se te queda grande Spatie porque tal cual puedes ver con roles y permisos tienes muchísimas opciones Entonces no todas las aplicaciones lo necesitan y es por eso que surgen las políticas como una una solución como quien dice previa aunque también se pueden utilizar en conjunto Y eso puede ser un poco lo confuso en todo esto pero aún así te voy a dar voy a intentar darte una Clara bueno cuándo puedes emplear una cuándo puedes emplear otra en unos momentos entonces la lógica de la aplicación depende del modelo esto es algo muy importante ya que esto es un poco más genérico simplemente es lo que te comentaba el usuario puede crear post y en base a algún permiso no pero esto ya viene siendo un poquito más de lógica de negocios un ejemplo de esto te lo puedo dar aquí en mi aplicación de desarrollolibre. net
En la cual puedes encontrar los mejores cursos y libros al mejor precio todos mis cursos y libros los puedes encontrar aquí siempre al mejor precio cuando compras uno básicamente te genera un cupón que espira en 30 días para que tú vuelvas a bueno para descuento para un siguiente curso entonces ya he salido el sponsor
Te quiero mostrar aquí un poquito una implementación que tengo por acá:
$filePayment = FilePayment::where('user_id', $user->id)->where('file_paymentable_id', $bookSection->book->id)->where('file_paymentable_type', Book::class)->first();
if ($filePayment == null)
return [202, "No has comprado el libro"];
Fíjate esto esto no es una política pero es un buen candidato para que yo lo traduzca una política en la cual él solamente va a obtener las secciones de un libro es decir aquí venimos a libros y fue por eso que te mostré la página no simplemente por darme publicidad vienes aquí este por ejemplo lo compré vengo aquí al visor aquí tengo el visor web y aquí puedo ver los libros entonces obviamente para evitar que alguien se me cuele simplemente por la URL yo tengo que preguntar si es usuario tiene ciertos permisos en ese caso para tener el permiso de poder ver el contenido que acabas que acabas de ver en pantalla él tiene que haberlo comprado que es básicamente este modelo que tenemos acá y es por eso lo que te comentaba Este es un buen candidato para definirlo en una política que a la final es esto y es precisamente para evitar colocar esto que yo lo tengo aquí definido como dos o tres veces eso es una aplicación pequeña y es por eso que no lo he hecho tanto Bueno fíjate que lo tengo más veces de lo que pensaba es una aplicación pequeña y es por eso que no me he hecho ese trabajo pero bueno como que dice todo lo puedes mejorar y seguramente en algún momento lo haré pero es eso básicamente tú aquí definirías una política que hace justamente esto pregunta si el usuario autenticado que aquí lo estoy obteniendo tiene el acceso al libro que quiere consumir en el detalle por lo tanto si un usuario no autenticado intenta ingresar o bueno que no compró este recurso intenta Ingresar a este recurso Simplemente no va a poder hacerlo por la regla que tenemos acá que esto otra vez lo puedes ver como una especie de política es decir suponte tú que es un policía un político bueno político no los políticos son corruptos que simplemente viene para acá y dice mira tú no puedes porque tú no lo has comprado entonces está un poco más ligado a lo que es la lógica de negocios los modelos y todo lo demás que la lógica de negocios básicamente la capa más fuerte viene siendo la de los modelos por eso que puedes ver aquí la siguiente traducción Y fíjate que en mi caso muy particular no me serviría mucho emplear spati claro Yo pudiera crear un permiso que diga no sé tiene acceso a los libros ver los libros o lo que sea perfectamente pudiera hacerlo pero ya yo creo que tú en este punto entiend desde que en este caso esto tiene la política una integración mayor con lo que es la lógica de negocios Mientras que el spatio el esquema de roles y permisos es un esquema un poco más genérico y por lo tanto al ser un poco más genérico lo puedes emplear para aplicaciones más grandes yo por ejemplo aquí en mi aplicación no me hace falta emplear spati por lo comentado antes así que básicamente aquí tienes un buen ejemplo de esto por supuesto tú en las políticas también puedes emplear lo que es spatie es decir las mismas condicionales que haces en spatti lo puedes colocar en las políticas pero usualmente no hace falta porque ya ya quedaría un poco grande o bueno en caso de que la lógica sea todavía un poco más compleja es decir suponte que por una parte tienes e necesitas algunos permisos Pero por otra parte también necesitas hacer lo que es alguna comprobación a nivel de los modelos es decir un poquito de espa y un poquito de las políticas entonces si en ese caso pudieras crear una política que englobe todas esas operaciones ya que la final la política tiene que cumplir no solamente con uno no tiene que ser necesariamente uno sino pueden ser varios pasos y esto depende un poco de la lógica de tu aplicación para que se cumpla determinado requisito es decir que pueda acceder a determinado recursos entonces en resumen es básicamente eso las políticas vienen siendo como que más ligado a tu aplicación a la lógica de negocios de tu aplicación mientras que spati lo puedes ver como un poco más genérico en un sistema de roles y permisos que puedas adaptar a tus necesidades en base a algún recurso que tú quieras administrar