Permisos y Accesos con KanKan en Aplicaciones Rails

Clase 28 de 36Curso de Introducción a Ruby on Rails

Resumen

¿Cómo establecer reglas de acceso y permisos en una aplicación Rails?

En el desarrollo de aplicaciones web, no solo es necesario crear funcionalidades, sino también asegurar que cada usuario tenga acceso a las acciones y datos que le correspondan. En este contexto, surge la pregunta: ¿cómo evitar que un usuario modifique o acceda a recursos que no deberían ser de su dominio? Para ello, la gema KanKan ofrece una solución eficaz en el manejo de permisos y accesos personalizados en aplicaciones Rails. Este artículo te guiará en el proceso de implementación con esta herramienta.

¿Cómo integrar la gema KanKan en tu proyecto Rails?

Para empezar, es crucial integrar la gema KanKan en el archivo Gemfile. La siguiente línea debe añadirse debajo de la gema Cocoon:

gem 'cancancan'

Una vez añadida, es importante tener en cuenta que ciertas versiones de Rails y Ruby pueden generar conflictos con la configuración, concretamente con el precargador de la aplicación llamado Spring. Para evitar problemas durante el desarrollo, se sugiere comentar Spring, especialmente si no estás en un entorno de producción:

# gem 'spring'

Después de realizar estos cambios, ejecuta la instalación de la gema:

bundle install

¿Cómo definir reglas de acceso con KanKan?

Después de la instalación, KanKan ofrece un generador de Rails que crea un archivo de Ability. Este archivo es el corazón de las reglas de acceso en la aplicación:

rails generate cancan:ability

Dentro del archivo ability.rb, se definen las reglas de acceso. Por ejemplo, si queremos permitir que los usuarios solo gestionen sus propias tareas, lo configuramos así:

can :manage, Task, owner_id: user.id

¿Cómo se integra KanKan con los controladores?

Para asegurar que las reglas definidas se apliquen, las acciones del controlador deben validarse con el método load_and_authorize_resource. Por ejemplo, en el controlador de tareas, se integraría de la siguiente forma:

class TasksController < ApplicationController
  load_and_authorize_resource

  # resto del código del controlador
end

¿Qué hacer con las excepciones de acceso denegado?

KanKan arroja excepciones AccessDenied cuando un usuario intenta ejecutar una acción para la cual no tiene permiso. Podríamos manejar esas excepciones utilizando el ApplicationController, de modo que redirija a un lugar seguro en vez de mostrar un error:

class ApplicationController < ActionController::Base
  rescue_from CanCan::AccessDenied do |exception|
    redirect_to root_path, alert: exception.message
  end
end

¿Cómo restringir la visualización de listas de recursos?

Para reducir la lista de tareas visibles solo a aquellas que el usuario tiene permiso de ver o gestionar, podemos modificar el método index del controlador:

def index
  @tasks = Task.joins(:participants)
               .where('tasks.owner_id = ? OR participants.user_id = ?', current_user.id, current_user.id)
               .group('tasks.id')
end

Utilizando métodos de ActiveRecord como joins combinados con condiciones específicas, aseguramos que solo se muestren las tareas relevantes.

¿Dónde encontrar más información sobre KanKan?

Para profundizar en más funcionalidades de KanKan, ofrece su documentación en GitHub, donde podrás explorar ejemplos y buenas prácticas en la definición de roles y permisos.

Implementar acceso controlado mejora no solo la seguridad, sino también la experiencia del usuario en tu aplicación. La utilización de gemas como KanKan simplifica este proceso, permitiéndote focalizar en lo realmente importante: el desarrollo de las características propias de tu aplicación.