Cómo gestionar usuarios en Supabase


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.
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:
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.
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.
Subscribe to my newsletter
Read articles from Leandro Gartner directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
