Dominio de la autorización en Rails con Pundit Gem

Dominio de la autorización en Rails con Pundit Gem

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

Artículos Relacionados

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

es_ESSpanish