Cómo gestionar usuarios en Supabase

Leandro GartnerLeandro Gartner
4 min read

Supabase nos facilita la autenticación de usuarios mediante su tabla auth.users. Sin embargo, para almacenar información adicional del usuario (como nombre, avatar, etc.), es recomendable crear una tabla personalizada, por ejemplo, public.profiles, y vincularla con auth.users. Esto nos permite mantener una estructura clara y acceder fácilmente a los datos desde el cliente.

Los siguientes pasos se pueden hacer desde la interfaz visual de Supabase pero te lo estaré mostrando con código porque es más sencillo de explicarlo de esta forma en el post.

Creando la tabla public.profiles

Primero, definimos la tabla profiles en el esquema public, estableciendo una relación con auth.users mediante una clave foránea:

💡
La creación de la siguiente tabla es solo un ejemplo práctico para el post, esta tabla puede tener todas las columnas que quieras o necesites, lo importante es que el id esté conectado con el auth.users.
create table public.profiles (
  id uuid not null references auth.users on delete cascade,
  username text,
  full_name text,
  avatar_url text,
  primary key (id)
);

alter table public.profiles enable row level security;

Aquí, id es la clave primaria y referencia al id de auth.users. El uso de on delete cascade asegura que, si un usuario se elimina de auth.users, su perfil asociado también se elimine automáticamente.

Configurando las políticas de seguridad (RLS)

Para proteger los datos y controlar el acceso, activamos las políticas de seguridad a nivel de fila (Row Level Security) y definimos las siguientes políticas:

-- Permitir que cualquier usuario autenticado inserte su propio perfil
create policy "Users can insert their own profile."
  on profiles for insert
  with check (auth.uid() = id);

-- Permitir que los usuarios actualicen su propio perfil
create policy "Users can update own profile."
  on profiles for update
  using (auth.uid() = id);

-- Permitir que los usuarios vean su propio perfil
create policy "Users can view their own profile."
  on profiles for select
  using (auth.uid() = id);

Estas políticas garantizan que cada usuario solo pueda acceder y modificar su propio perfil. El contenido que está entre comillas (““) es una descripción de la política, puedes poner lo que quieras ahí para poder identificarla mejor en el futuro.

Automatizando la creación de perfiles con triggers

Para que cada vez que un usuario se registre se cree automáticamente su perfil en public.profiles, utilizamos una función y un trigger:

-- Función que inserta un nuevo perfil al registrarse un usuario
create or replace function public.handle_new_user()
returns trigger
language plpgsql
security definer
set search_path = public
as $$
begin
  insert into public.profiles (id, username, full_name, avatar_url) -- Aquí puedes agregar o quitar todos los campos que tengas en tu tabla
  values (
    new.id,
    new.raw_user_meta_data ->> 'username',
    new.raw_user_meta_data ->> 'full_name',
    new.raw_user_meta_data ->> 'avatar_url'
  ); -- El orden de estos campos es importante, porque el valor se insertará en la tabla correspondiente al orden definido en el insert de arriba
  return new;
end;
$$;

-- Trigger que ejecuta la función después de insertar un nuevo usuario
create trigger on_auth_user_created
after insert on auth.users
for each row execute procedure public.handle_new_user();

Con esto, cada vez que un nuevo usuario se registre, se creará automáticamente una entrada en public.profiles con los datos proporcionados.

💡
Puedes ver los triggers y funciones creados en el editor visual de Supabase si accedes desde el menú lateral a database > functions o database > triggers.

Registrando usuarios con metadata adicional

Al registrar un usuario, podemos incluir información adicional en el campo data, que luego se almacenará en raw_user_meta_data de auth.users y se utilizará en la función del trigger:

const { data, error } = await supabase.auth.signUp({
  email: 'usuario@example.com',
  password: 'contraseña_segura',
  options: {
    data: {
      username: 'usuario123',
      full_name: 'Nombre Apellido',
      avatar_url: 'https://example.com/avatar.png'
    }
  }
});

De esta manera, los datos adicionales se insertarán automáticamente en la tabla profiles al momento del registro. Para que los datos se almacenen en la tabla profiles deberás asegurarte de que la función handle_new_user que hemos creado antes lea los datos de raw_user_meta_data y los inserte en una columna de la tabla profiles, de lo contrario estarás pasando los metadatos pero no se guardarán en tu tabla.


Si tienes alguna duda o quieres profundizar en algún aspecto, no dudes en dejar un comentario o contactarme.

1
Subscribe to my newsletter

Read articles from Leandro Gartner directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Leandro Gartner
Leandro Gartner