certmundo.
es‑mx

6 min de lectura

¿Cómo agregar autenticación de usuarios a tu app Rails?

Agregar autenticación de usuarios a tu app Rails es más fácil con la gema Devise, que instala un sistema completo de registro e inicio de sesión en minutos.

¿Sabías que la mayoría de los hackeos ocurren porque alguien construyó su propio sistema de contraseñas? No lo hagas tú también. Las apps profesionales — desde startups en Monterrey hasta plataformas como Mercado Libre — usan soluciones probadas. Devise es la más popular en el mundo Rails.

¿Qué hace Devise por ti?

Devise no es solo un formulario de login. Es un sistema completo de seguridad.

Te da registro, inicio de sesión, cierre de sesión y recuperación de contraseña. Todo eso, listo desde el primer día. Sin que tengas que escribir la lógica de cifrado tú mismo.

Esto importa porque cifrar contraseñas mal es un error gravísimo. Devise usa bcrypt, un algoritmo estándar de la industria. Tus usuarios estarán protegidos desde el inicio.

La historia de Carlos: su primer login

Carlos tiene 24 años y trabaja como freelance en Ciudad de México. Un cliente de Puebla le pidió una app para gestionar pedidos de su tienda de uniformes.

Carlos intentó primero hacer su propio sistema de sesiones. Pasó tres días y el código se volvió un caos. Un amigo le dijo: "instala Devise, en dos horas tienes todo funcionando."

Lo hizo. Y efectivamente, en menos de dos horas tenía registro, login y logout funcionando. El cliente quedó feliz. Carlos cobró $8,500 por el proyecto sin problema.

Instalar Devise paso a paso

Primero, agrega la gema a tu archivo Gemfile:

gem 'devise'

Luego corre estos comandos en la terminal:

bundle install
rails generate devise:install

Devise te mostrará algunas instrucciones. La más importante: agregar esta línea a config/environments/development.rb:

config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

Eso permite que Devise envíe correos de confirmación y recuperación de contraseña durante el desarrollo.

Generar el modelo de usuario

Ahora genera el modelo User con Devise:

rails generate devise User
rails db:migrate

Ese comando crea automáticamente la tabla users en tu base de datos. También genera las rutas, el modelo y los controladores necesarios. Todo de una vez.

Puedes ver las rutas que Devise agregó con:

rails routes | grep user

Verás rutas como /users/sign_in, /users/sign_up y /users/sign_out. Ya existen. No tuviste que crearlas.

Proteger tus páginas con before_action

Ahora viene la parte importante: evitar que usuarios no registrados vean páginas privadas.

En cualquier controlador, agrega esta línea:

before_action :authenticate_user!

Eso es todo. Si alguien intenta entrar sin sesión iniciada, Rails lo redirige al login automáticamente. Sin código extra.

Por ejemplo, en una app de pedidos como la de Carlos:

class PedidosController < ApplicationController
  before_action :authenticate_user!

  def index
    @pedidos = current_user.pedidos
  end
end

Fíjate en current_user. Devise te da ese helper gratis. Es el usuario que tiene sesión activa en ese momento. Con current_user.pedidos obtienes solo los pedidos de esa persona, no los de todos.

La historia de Sofía: separar lo público de lo privado

Sofía es desarrolladora junior en una agencia digital de Guadalajara. Trabajan con tiendas en línea medianas, del tipo que compite con Liverpool en nichos específicos.

Su tarea era una app donde los vendedores podían subir sus productos, pero los compradores solo podían ver el catálogo sin registrarse.

Sofía usó before_action de forma selectiva:

class ProductosController < ApplicationController
  before_action :authenticate_user!, only: [:new, :create, :edit, :update, :destroy]

  def index
    @productos = Producto.all
  end
end

Con only: le dijo a Rails: "protege solo estas acciones." El índice de productos quedó público. Las acciones de crear y editar, protegidas.

Su jefa revisó el código y dijo: "esto está muy limpio." Sofía recibió su primer aumento ese mes: de $14,000 a $17,500.

Mostrar información del usuario en las vistas

Recuerdas el layout de la lección anterior, ¿verdad? Ese archivo application.html.erb que envuelve todas las páginas.

Puedes usar current_user ahí también. Por ejemplo, mostrar el correo del usuario en la barra de navegación:

<% if user_signed_in? %>
  <p>Hola, <%= current_user.email %></p>
  <%= link_to "Cerrar sesión", destroy_user_session_path, data: { turbo_method: :delete } %>
<% else %>
  <%= link_to "Iniciar sesión", new_user_session_path %>
  <%= link_to "Registrarse", new_user_registration_path %>
<% end %>

Devise también te da el helper user_signed_in?. Devuelve true si hay sesión activa. Con eso puedes mostrar opciones diferentes según el estado del usuario.

Personalizar las vistas de Devise

Por defecto, Devise genera sus propias vistas. Son funcionales pero genéricas. Si quieres cambiar el diseño, corre:

rails generate devise:views

Eso copia las vistas de Devise a tu proyecto, dentro de app/views/devise/. A partir de ahí, puedes editarlas como cualquier archivo ERB.

Por ejemplo, el formulario de registro está en app/views/devise/registrations/new.html.erb. Puedes agregar campos, cambiar estilos o agregar el logo de tu app.

Errores comunes al usar Devise

Hay tres errores que casi todos cometen al principio.

Primero: olvidar configurar default_url_options. Si no lo haces, Devise lanza un error cuando intenta enviar correos. La app no arranca correctamente en producción.

Segundo: usar before_action :authenticate_user! en ApplicationController sin excepciones. Eso bloquea hasta las páginas públicas como el home o el catálogo. Siempre usa only: o except: según necesites.

Tercero: intentar modificar el modelo User sin entender los módulos de Devise. El modelo tiene una línea como esta:

devise :database_authenticatable, :registerable,
       :recoverable, :rememberable, :validatable

Cada palabra es un módulo. :validatable agrega validaciones de correo y contraseña. :recoverable activa la recuperación por correo. Si borras uno por accidente, perderás esa funcionalidad sin saber por qué.

La historia de don Roberto: el error que costó una semana

Don Roberto tiene 47 años. Trabaja en el departamento de TI de una distribuidora de alimentos en Querétaro, proveedora de cadenas como FEMSA. Decidió aprender Rails para automatizar reportes internos.

Al instalar Devise, borró :validatable del modelo porque pensaba que las validaciones las pondría él mismo. Su app aceptaba contraseñas de un solo carácter. Peor aún, aceptaba correos sin formato válido.

Una semana después, descubrió el problema cuando un usuario se registró con la contraseña "1" y no podía entender por qué su sistema era tan inseguro.

La lección: no modifiques los módulos de Devise si no entiendes qué hace cada uno. Lee la documentación primero. Don Roberto lo aprendió a las malas, pero tú no tienes que hacerlo así.

Agregar campos extra al registro

Devise por defecto solo pide correo y contraseña. Si quieres agregar un campo como nombre, necesitas dos pasos.

Primero, agrega la columna a la base de datos:

rails generate migration AddNombreToUsers nombre:string
rails db:migrate

Segundo, permite ese campo en el controlador de la aplicación:

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:nombre])
  end
end

Eso le dice a Devise: "está bien recibir el campo nombre durante el registro." Sin esto, Rails ignora ese campo por seguridad.

Lo que aprendiste hoy

Devise es una de las herramientas más poderosas del ecosistema Rails. Con ella puedes construir sistemas de autenticación seguros, rápidos y profesionales. No tienes que reinventar la rueda.

Como Carlos, Sofía y don Roberto, todos pasamos por el proceso de aprender cómo funciona. Lo importante es entender cada paso, no solo copiar comandos.

La próxima vez que alguien te pida una app con usuarios, ya sabes exactamente qué hacer.

Puntos clave

  • Devise instala un sistema completo de autenticación (registro, login, logout, recuperación de contraseña) con solo agregar la gema y correr dos comandos en la terminal.
  • Usa `before_action :authenticate_user!` en tus controladores para proteger páginas privadas. Combínalo con `only:` o `except:` para controlar qué acciones requieren sesión.
  • Devise te da helpers gratuitos como `current_user` y `user_signed_in?` que puedes usar en controladores y vistas para personalizar la experiencia según el estado del usuario.
  • No borres ni modifiques los módulos de Devise en el modelo `User` sin entender qué hace cada uno. Módulos como `:validatable` protegen tu app de contraseñas y correos inválidos.
  • Para agregar campos extra al registro (como `nombre`), debes crear la columna en la base de datos Y permitir ese campo en `ApplicationController` usando `configure_permitted_parameters`.

Comparte esta lección: