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