Files
RDO/fix_oauth_rls_netlify.sql

182 lines
5.8 KiB
PL/PgSQL

-- ============================================================================
-- CORREÇÃO RLS PARA OAUTH NO NETLIFY
-- ============================================================================
-- Este script corrige as políticas RLS para permitir autenticação OAuth
-- quando o app está hospedado no Netlify
-- ============================================================================
-- 1. PERMITIR CRIAÇÃO AUTOMÁTICA DE PERFIL APÓS OAUTH
-- ============================================================================
DROP POLICY IF EXISTS "Users can create own profile" ON public.usuarios;
CREATE POLICY "Users can create own profile" ON public.usuarios
FOR INSERT
WITH CHECK (auth.uid() = id);
-- 2. CORRIGIR FUNÇÃO DE CRIAÇÃO DE USUÁRIO
-- ============================================================================
CREATE OR REPLACE FUNCTION public.handle_new_user()
RETURNS TRIGGER AS $$
BEGIN
-- Inserir novo usuário na tabela public.usuarios
INSERT INTO public.usuarios (
id,
email,
nome,
role,
ativo
) VALUES (
NEW.id,
NEW.email,
COALESCE(
NEW.raw_user_meta_data->>'nome',
NEW.raw_user_meta_data->>'name',
NEW.raw_user_meta_data->>'full_name',
split_part(NEW.email, '@', 1)
),
'usuario',
true
)
ON CONFLICT (id) DO UPDATE SET
email = EXCLUDED.email,
nome = COALESCE(EXCLUDED.nome, public.usuarios.nome),
updated_at = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
-- 3. GARANTIR QUE O TRIGGER ESTÁ ATIVO
-- ============================================================================
DROP TRIGGER IF EXISTS on_auth_user_created ON auth.users;
CREATE TRIGGER on_auth_user_created
AFTER INSERT ON auth.users
FOR EACH ROW
EXECUTE FUNCTION public.handle_new_user();
-- 4. PERMITIR LEITURA DE ORGANIZAÇÕES PARA NOVOS USUÁRIOS
-- ============================================================================
DROP POLICY IF EXISTS "Users can view orgs during signup" ON public.organizacoes;
CREATE POLICY "Users can view orgs during signup" ON public.organizacoes
FOR SELECT
USING (auth.uid() IS NOT NULL);
-- 5. PERMITIR CRIAÇÃO DE ORGANIZAÇÃO PARA NOVOS USUÁRIOS
-- ============================================================================
DROP POLICY IF EXISTS "Users can create org" ON public.organizacoes;
CREATE POLICY "Users can create org" ON public.organizacoes
FOR INSERT
WITH CHECK (auth.uid() IS NOT NULL);
-- 6. PERMITIR CRIAÇÃO DE VÍNCULO ORGANIZAÇÃO-USUÁRIO
-- ============================================================================
DROP POLICY IF EXISTS "Users can create org membership" ON public.organizacao_usuarios;
CREATE POLICY "Users can create org membership" ON public.organizacao_usuarios
FOR INSERT
WITH CHECK (
usuario_id = auth.uid()
OR organizacao_id IN (
SELECT organizacao_id
FROM public.organizacao_usuarios
WHERE usuario_id = auth.uid()
AND role IN ('owner', 'admin')
)
);
-- 7. CORRIGIR POLÍTICA DE LEITURA DE USUÁRIOS
-- ============================================================================
-- Remover política antiga que pode estar causando recursão
DROP POLICY IF EXISTS "Admins can view all profiles" ON public.usuarios;
-- Criar política sem recursão
CREATE POLICY "Admins can view all profiles" ON public.usuarios
FOR SELECT
USING (
-- Usuário pode ver próprio perfil
auth.uid() = id
OR
-- Ou é admin/dev (verificação direta sem subquery recursiva)
EXISTS (
SELECT 1 FROM public.usuarios u
WHERE u.id = auth.uid()
AND u.role IN ('dev', 'admin')
LIMIT 1
)
OR
-- Ou está na mesma organização
organizacao_id IN (
SELECT u2.organizacao_id
FROM public.usuarios u2
WHERE u2.id = auth.uid()
)
);
-- 8. GARANTIR PERMISSÕES PARA AUTHENTICATED ROLE
-- ============================================================================
GRANT USAGE ON SCHEMA public TO authenticated;
GRANT SELECT, INSERT, UPDATE ON public.usuarios TO authenticated;
GRANT SELECT, INSERT, UPDATE ON public.organizacoes TO authenticated;
GRANT SELECT, INSERT, UPDATE ON public.organizacao_usuarios TO authenticated;
-- 9. CRIAR FUNÇÃO AUXILIAR PARA VERIFICAR SE USUÁRIO EXISTE
-- ============================================================================
CREATE OR REPLACE FUNCTION public.user_profile_exists(user_id UUID)
RETURNS BOOLEAN AS $$
BEGIN
RETURN EXISTS (
SELECT 1 FROM public.usuarios WHERE id = user_id
);
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
-- 10. VERIFICAÇÃO FINAL
-- ============================================================================
-- Verificar se as políticas foram criadas
SELECT
schemaname,
tablename,
policyname,
permissive,
roles,
cmd
FROM pg_policies
WHERE schemaname = 'public'
AND tablename IN ('usuarios', 'organizacoes', 'organizacao_usuarios')
ORDER BY tablename, policyname;
-- Verificar se o trigger está ativo
SELECT
trigger_name,
event_manipulation,
event_object_table,
action_statement
FROM information_schema.triggers
WHERE trigger_schema = 'auth'
AND event_object_table = 'users';
-- ============================================================================
-- FIM DA CORREÇÃO
-- ============================================================================
-- INSTRUÇÕES DE USO:
-- 1. Copie todo este script
-- 2. Acesse: https://supabase.com/dashboard/project/xzudfhifaancyxxfdejx/sql/new
-- 3. Cole o script e clique em "Run"
-- 4. Verifique se não há erros
-- 5. Teste o login OAuth no Netlify