es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿No se puede insertar en la tabla con RLS a pesar de haber iniciado sesión?

Quiero agregar una fila a una tabla “profiles” en el esquema público inmediatamente después de que el usuario se haya registrado y se haya creado su usuario de autenticación en la base de datos.

El usuario se crea correctamente y puedo ver los detalles del usuario en el objeto “user” devuelto por la función “supabase.auth.signUp”.

Sin embargo, cuando intento hacer una inserción manual en la tabla, recibo un error que indica que se está violando el RLS (Row Level Security) en la tabla. Sin embargo, el usuario ha iniciado sesión y el uid es correcto, ¿por qué no me deja insertar datos?

async function handleSubmit(e: any) {
    e.preventDefault();

    const email = emailRef.current.value;
    const password = passwordRef.current.value;

    // const navigate = useNavigate();

    const {user, error} = await signUp({email, password});

    if(error){
      alert("Error al iniciar sesión");
    } else {
      await addUserDetails({
        uuid: user.id,
        firstName: firstNameRef.current.value,
        lastName: lastNameRef.current.value
      });
      navigate("/dashboard");
    }
}

return //resto del componente
}

export async function addUserDetails({
  uuid, firstName, lastName
}){
  const {data, error } = await supabase.from("profiles").insert([{
    id: uuid,
    first<em>name: firstName,
    last</em>name: lastName
  }]);
}

RLS en la tabla:
crear directiva "Los usuarios pueden insertar su propio perfil."
  en profiles para insertar
  con comprobación (auth.uid() = id);
Tags:  

Answer

  1. Avatar for davy.ai

    El error que estás recibiendo al intentar insertar datos manualmente en la tabla ‘profiles’ se debe a la política de RLS (seguridad a nivel de fila) establecida en la tabla. La política se llama “Los usuarios pueden insertar su propio perfil” y establece que los usuarios solo pueden insertar filas donde la columna ‘id’ (presumiblemente el id del usuario) coincida con el id del usuario autenticado.

    Dado que estás intentando insertar la fila inmediatamente después de que el usuario se registra y se crea su usuario autenticado, es posible que el token de autenticación aún no se haya propagado completamente al servidor de Supabase. Por lo tanto, cuando intentas insertar la fila, Supabase está aplicando la política de RLS y la verificación falla debido a la falta de un usuario completamente autenticado en ese momento.

    Para solucionar este problema, podrías intentar esperar unos segundos después de que el usuario se registre antes de insertar la fila, para asegurarte de que el token de autenticación se haya propagado completamente al servidor de Supabase. Alternativamente, podrías modificar la política de RLS para permitir la inserción incluso si el token de autenticación no está presente (aunque esto puede debilitar la seguridad de tu aplicación).

    Por último, el mensaje de error que estás recibiendo indica que la política de RLS está siendo violada, no que el uid sea incorrecto. Esto se debe a que la política está verificando el valor de ‘auth.uid()’ con la columna ‘id’ de la tabla ‘profiles’, no con el ‘uid’ del usuario.

Comments are closed.