Supabase: Getting "role 'user' does not exist" error only when authenticated user queries product/category tables
Problem Summary
I'm experiencing a strange issue with Supabase where:
When user is logged out (anonymous): GET requests to /rest/v1/product и/rest/v1/category return 200 ok
Когда пользователь регистрируется в (аутентификация): те же запросы возвращают 400 Bad Repress с ошибкой:
{
"code": "22023",
"details": null,
"hint": null,
"message": "role \"user\" does not exist"
}
< /code>
схема базы данных < /h2>
У меня есть следующие таблицы в моем проекте Supabase: < /p>
-- profiles table (contains user role info)
CREATE TABLE public.profiles (
id UUID REFERENCES auth.users(id) PRIMARY KEY,
name TEXT,
email TEXT,
role TEXT DEFAULT 'user',
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- product table
CREATE TABLE public.product (
id INT4 PRIMARY KEY,
name VARCHAR,
price NUMERIC,
stock INT4,
category INT4,
image_url TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- category table
CREATE TABLE public.category (
id INT4 PRIMARY KEY,
name VARCHAR,
created_at TIMESTAMPTZ DEFAULT NOW()
);
< /code>
пользовательский токен доступа к крюку < /h2>
У меня есть пользовательский токен для доступа, который считывает роль пользователя из профилей: < /p>
CREATE OR REPLACE FUNCTION public.custom_access_token_hook(event jsonb)
RETURNS jsonb
LANGUAGE plpgsql
SECURITY DEFINER
AS $$
DECLARE
user_role text;
user_name text;
user_email text;
BEGIN
SELECT role, name, email
INTO user_role, user_name, user_email
FROM public.profiles
WHERE id = (event->>'user_id')::uuid;
IF user_role IS NULL THEN
user_role := 'user';
END IF;
RETURN jsonb_set(
event,
'{claims}',
COALESCE(event->'claims', '{}') || jsonb_build_object(
'role', user_role,
'user_name', COALESCE(user_name, ''),
'user_email', COALESCE(user_email, '')
)
);
END;
$$;
< /code>
код фронта < /h2>
// This works when user is logged out
const { data, error } = await supabase
.from('product')
.select('*');
// Same code returns error when user is logged in
< /code>
Что я попробовал < /h2>
[*] [b] отключен RLS < /strong> на таблицах продукта и категорий: < /p>
ALTER TABLE public.product DISABLE ROW LEVEL SECURITY;
ALTER TABLE public.category DISABLE ROW LEVEL SECURITY;
[*] удалил все политики RLS [/b] из этих таблиц
[*] предоставленные режиссии для Anon и Authenticated Roles:
Дополнительный контекст < /h2>
Проект Supabase является относительно новым < /li>
Ошибка начала появляться после реализации Custom Access Token Hook < /li>
forgin forgine fundulty. Упоминает роль PostgreSQL «Пользователь», которая предполагает, что она пытается использовать роль приложения в качестве роли базы данных < /li>
< /ul>
Вопросы < /h2>
Почему один и тот же запрос работает для анонимных пользователей, но не выполняет аутентичные пользователи? Интерпретируется как роль базы данных PostgreSQL? @Supabase/Supabase-js
Supabase: Getting "role 'user' does not exist" error only when authenticated user queries product/category tables Problem Summary I'm experiencing a strange issue with Supabase where: [list] [*][b]When user is logged out[/b] (anonymous): GET requests to /rest/v1/product и/rest/v1/category return [b] 200 ok [/b] [*] [b] Когда пользователь регистрируется в [/b] (аутентификация): те же запросы возвращают [b] 400 Bad Repress [/b] с ошибкой: [/list]
" lang-j-hrime "[code]{ "code": "22023", "details": null, "hint": null, "message": "role \"user\" does not exist" } < /code> схема базы данных < /h2> У меня есть следующие таблицы в моем проекте Supabase: < /p> -- profiles table (contains user role info) CREATE TABLE public.profiles ( id UUID REFERENCES auth.users(id) PRIMARY KEY, name TEXT, email TEXT, role TEXT DEFAULT 'user', created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() );
-- category table CREATE TABLE public.category ( id INT4 PRIMARY KEY, name VARCHAR, created_at TIMESTAMPTZ DEFAULT NOW() ); < /code> пользовательский токен доступа к крюку < /h2> У меня есть пользовательский токен для доступа, который считывает роль пользователя из профилей: < /p> CREATE OR REPLACE FUNCTION public.custom_access_token_hook(event jsonb) RETURNS jsonb LANGUAGE plpgsql SECURITY DEFINER AS $$ DECLARE user_role text; user_name text; user_email text; BEGIN SELECT role, name, email INTO user_role, user_name, user_email FROM public.profiles WHERE id = (event->>'user_id')::uuid;
IF user_role IS NULL THEN user_role := 'user'; END IF;
RETURN jsonb_set( event, '{claims}', COALESCE(event->'claims', '{}') || jsonb_build_object( 'role', user_role, 'user_name', COALESCE(user_name, ''), 'user_email', COALESCE(user_email, '') ) ); END; $$; < /code> код фронта < /h2> // This works when user is logged out const { data, error } = await supabase .from('product') .select('*');
// Same code returns error when user is logged in < /code> Что я попробовал < /h2>
[*] [b] отключен RLS < /strong> на таблицах продукта и категорий: < /p> ALTER TABLE public.product DISABLE ROW LEVEL SECURITY; ALTER TABLE public.category DISABLE ROW LEVEL SECURITY; [/code]
[*] удалил все политики RLS [/b] из этих таблиц
[*] [b] предоставленные режиссии [/b] для Anon и Authenticated Roles:
Дополнительный контекст < /h2> [list] Проект Supabase является относительно новым < /li> Ошибка начала появляться после реализации Custom Access Token Hook < /li> forgin forgine fundulty. Упоминает роль PostgreSQL «Пользователь», которая предполагает, что она пытается использовать роль приложения в качестве роли базы данных < /li> < /ul> Вопросы < /h2>
Почему один и тот же запрос работает для анонимных пользователей, но не выполняет аутентичные пользователи? Интерпретируется как роль базы данных PostgreSQL? @Supabase/Supabase-js [*] База данных: postgresql (Supabase Managed) [/list] Любая помощь будет очень оценена!>