La autorización es un componente crítico de cualquier aplicación web, ya que garantiza que los usuarios sólo puedan acceder a los recursos que tienen permitidos. Pundit es una popular librería de autorización para Ruby on Rails que permite a los desarrolladores definir reglas de acceso detalladas. Este artículo te guiará en el uso de la gema Pundit para la autorización en una aplicación web. Aplicación de rielescon un ejemplo.
Guía paso a paso
1. Cómo añadir Pundit a su aplicación Rails
Primero, añade Pundit a tu Gemfile y ejecuta bundle install:
gema 'pundit
instalación del paquete
A continuación, genere los archivos de instalación de Pundit:
rails generar pundit:instalar
Esto creará un application_policy.rb en el directorio app/policies, que sirve como política por defecto para todos los modelos.
2. Definición de políticas
Las políticas en Pundit son Objetos Ruby Simples (POROs) que encapsulan la lógica de autorización. Cada política corresponde a un modelo de su aplicación. Consideremos un ejemplo sencillo en el que tenemos un modelo Post y queremos definir reglas de autorización para él.
Crear una política para el modelo Post:
rails genera pundit:policy post
Esto genera un post_policy.rb en el directorio app/policies.
3. Implementación de la lógica de autorización
Abra el archivo post_policy.rb y defina las reglas de autorización:
clase PostPolicy < ApplicationPolicy def ¿índice? true end def mostrar? true end def crear? user.present? end def update? user.present? && user == record.user end def destroy? user.present? && user == record.user end end
Aquí definimos los métodos correspondientes a cada acción (indexar, mostrar, crear, actualizar y destruir). Estos métodos devuelven true o false en función del usuario y del registro al que se accede.
4. Uso de políticas en los controladores
En sus controladores, puede utilizar Pundit para autorizar acciones. En primer lugar, incluya el módulo Pundit en el ApplicationController:
clase ApplicationController < ActionController::Base
incluir Pundit
fin
A continuación, utilice el método authorize para comprobar la autorización en su PostsController:
class PostsController < ApplicationController ¡before_action :authenticate_user! before_action :set_post, only: [:mostrar, :editar, :actualizar, :destruir] def index @posts = Post.all autorizar @posts end def mostrar end def new @post = Post.new autorizar @post end def crear @post = current_user.posts.build(post_params) autorizar @post if @post.save redirect_to @post, notice: 'La entrada se ha creado correctamente'. else render :nuevo end end def editar autorizar @post end def update autorizar @post if @post.update(post_params) redirect_to @post, notice: 'El post se ha actualizado correctamente.' else render :editar end end def destruir autorizar @post @post.destroy redirect_to posts_url, notice: 'Post was successfully destroyed.' end privado def set_post @post = Post.find(params[:id]) end def post_params params.require(:post).permit(:title, :body) end end
En este controlador, utilizamos authorize para comprobar los permisos antes de realizar cualquier acción.
5. Gestión de accesos no autorizados
Pundit genera un error Pundit::NotAuthorizedError si un usuario no está autorizado a realizar una acción. Puede gestionar este error de forma global en el ApplicationController:
clase ApplicationController < ActionController::Base incluir Pundit rescue_from Pundit::NotAuthorizedError, with: :usuario_no_autorizado privado def usuario_no_autorizado flash[:alert] = "No está autorizado a realizar esta acción". redirect_to(request.referrer || root_path) end end
De este modo, si un usuario intenta realizar una acción no autorizada, será redirigido con un mensaje de error.
Conclusión
El uso de Pundit para la autorización en Rails es una forma potente y flexible de controlar el acceso a los recursos de tu aplicación. Definiendo políticas y utilizándolas en tus controladores, puedes asegurarte de que los usuarios sólo pueden realizar las acciones para las que están autorizados. Esto cubre lo básico, pero Pundit también soporta escenarios más complejos, incluyendo ámbitos y generadores de políticas personalizadas.
Para obtener información más detallada, consulte Repositorio GitHub de Pundit