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.