94 lines
4.3 KiB
SQL
94 lines
4.3 KiB
SQL
-- ============================================================================
|
|
-- SCRIPT DE CORREÇÃO TOTAL DE PERMISSÕES (RLS) - TRACKSTEEL RDO
|
|
-- ============================================================================
|
|
-- OBJETIVO: Garantir que o usuário consiga ler seu próprio perfil (para saber que é Dev)
|
|
-- e que o Super Admin tenha acesso irrestrito.
|
|
-- ============================================================================
|
|
|
|
-- 1. TABELA USUARIOS (A MAIS IMPORTANTE)
|
|
-- ============================================================================
|
|
ALTER TABLE public.usuarios ENABLE ROW LEVEL SECURITY;
|
|
|
|
-- Limpar policies antigas para evitar conflitos
|
|
DROP POLICY IF EXISTS "Permitir leitura do próprio perfil" ON public.usuarios;
|
|
DROP POLICY IF EXISTS "Dev e Admins veem todos usuarios" ON public.usuarios;
|
|
DROP POLICY IF EXISTS "Super Admin Total" ON public.usuarios;
|
|
DROP POLICY IF EXISTS "Atualizar proprio perfil" ON public.usuarios;
|
|
|
|
-- 1.1. REGRA BÁSICA: Todo usuário autenticado pode ler SEUS PRÓPRIOS DADOS
|
|
-- Sem isso, o sistema não sabe quem você é.
|
|
CREATE POLICY "Permitir leitura do próprio perfil" ON public.usuarios
|
|
FOR SELECT USING (auth.uid() = id);
|
|
|
|
-- 1.2. REGRA DE EDIÇÃO: Usuário pode atualizar seus dados básicos
|
|
CREATE POLICY "Atualizar proprio perfil" ON public.usuarios
|
|
FOR UPDATE USING (auth.uid() = id);
|
|
|
|
-- 1.3. REGRA DO SUPER ADMIN (Hardcoded para segurança máxima no momento)
|
|
-- O email admtracksteel@gmail.com pode FAZER TUDO em usuarios.
|
|
CREATE POLICY "Super Admin Total" ON public.usuarios
|
|
FOR ALL USING (
|
|
(SELECT email FROM auth.users WHERE id = auth.uid()) = 'admtracksteel@gmail.com'
|
|
);
|
|
|
|
-- 2. TABELA ORGANIZACOES
|
|
-- ============================================================================
|
|
ALTER TABLE public.organizacoes ENABLE ROW LEVEL SECURITY;
|
|
|
|
DROP POLICY IF EXISTS "Leitura Organizacoes" ON public.organizacoes;
|
|
DROP POLICY IF EXISTS "Escrita Organizacoes Super Admin" ON public.organizacoes;
|
|
|
|
-- 2.1. Leitura: Usuários veem sua própria organização OU Super Admin vê todas
|
|
CREATE POLICY "Leitura Organizacoes" ON public.organizacoes
|
|
FOR SELECT USING (
|
|
id = (SELECT organizacao_id FROM public.usuarios WHERE id = auth.uid())
|
|
OR
|
|
(SELECT role FROM public.usuarios WHERE id = auth.uid()) = 'dev'
|
|
);
|
|
|
|
-- 2.2. Escrita: Apenas DEV pode criar/editar organizações (por enquanto)
|
|
CREATE POLICY "Escrita Organizacoes Super Admin" ON public.organizacoes
|
|
FOR ALL USING (
|
|
(SELECT role FROM public.usuarios WHERE id = auth.uid()) = 'dev'
|
|
);
|
|
|
|
|
|
-- 3. REFORÇAR CONFIGURAÇÕES (Configs Globais)
|
|
-- ============================================================================
|
|
-- Garantir que tabelas de configuração sejam legíveis por todos que estão logados
|
|
ALTER TABLE public.tipos_atividade ENABLE ROW LEVEL SECURITY;
|
|
|
|
DROP POLICY IF EXISTS "Leitura Geral Configs" ON public.tipos_atividade;
|
|
CREATE POLICY "Leitura Geral Configs" ON public.tipos_atividade
|
|
FOR SELECT USING (auth.uid() IS NOT NULL);
|
|
|
|
DROP POLICY IF EXISTS "Escrita Admin Configs" ON public.tipos_atividade;
|
|
CREATE POLICY "Escrita Admin Configs" ON public.tipos_atividade
|
|
FOR ALL USING (
|
|
(SELECT role FROM public.usuarios WHERE id = auth.uid()) IN ('dev', 'admin')
|
|
);
|
|
|
|
-- (Repetir lógica para as outras tabelas essencialmente garante acesso)
|
|
-- Aplicando o mesmo conceito para condicoes_climaticas, etc de forma simplificada:
|
|
-- Se precisar rodar para todas, o script setup_full_db.sql já cobriu,
|
|
-- mas aqui o foco é desbloquear o ACESSO AO USUÁRIO/ADMIN.
|
|
|
|
|
|
-- 4. FORÇAR (NOVAMENTE) O CARGO DEV PARA O SUPER ADMIN
|
|
-- ============================================================================
|
|
-- Bypass RLS para garantir que o update ocorra agora no banco.
|
|
UPDATE public.usuarios
|
|
SET role = 'dev', ativo = true
|
|
WHERE email = 'admtracksteel@gmail.com';
|
|
|
|
-- Caso não exista na tabela usuarios (mas exista no Auth), insere forçado:
|
|
INSERT INTO public.usuarios (id, email, nome, role, ativo)
|
|
SELECT id, email, 'Super Admin', 'dev', true
|
|
FROM auth.users
|
|
WHERE email = 'admtracksteel@gmail.com'
|
|
ON CONFLICT (id) DO UPDATE SET role = 'dev', ativo = true;
|
|
|
|
-- ============================================================================
|
|
-- FIM DO SCRIPT DE CORREÇÃO
|
|
-- ============================================================================
|