First commit - backup RDOC
This commit is contained in:
452
supabase/migrations/20241202000003_create_rls_policies.sql
Normal file
452
supabase/migrations/20241202000003_create_rls_policies.sql
Normal file
@@ -0,0 +1,452 @@
|
||||
-- ========================================
|
||||
-- MIGRATION: Row Level Security Policies
|
||||
-- Data: 2024-12-02
|
||||
-- Descrição: Políticas RLS para isolamento multi-tenant
|
||||
-- ========================================
|
||||
|
||||
-- ========================================
|
||||
-- HABILITAR RLS EM TODAS AS TABELAS
|
||||
-- ========================================
|
||||
|
||||
ALTER TABLE public.organizacoes ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE public.usuarios ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE public.organizacao_usuarios ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE public.convites ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE public.obras ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE public.rdos ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE public.rdo_atividades ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE public.rdo_mao_obra ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE public.rdo_equipamentos ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE public.rdo_ocorrencias ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE public.rdo_anexos ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE public.rdo_inspecoes_solda ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE public.rdo_verificacoes_torque ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE public.tarefas ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE public.task_logs ENABLE ROW LEVEL SECURITY;
|
||||
ALTER TABLE public.organizacao_metricas ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- ========================================
|
||||
-- POLÍTICAS PARA ORGANIZAÇÕES
|
||||
-- ========================================
|
||||
|
||||
-- Usuários podem ver organizações onde são membros
|
||||
CREATE POLICY "Usuários veem suas organizações" ON public.organizacoes
|
||||
FOR SELECT USING (
|
||||
id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid() AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
-- Apenas owners podem atualizar organização
|
||||
CREATE POLICY "Owners podem atualizar organização" ON public.organizacoes
|
||||
FOR UPDATE USING (
|
||||
id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid()
|
||||
AND role = 'owner'
|
||||
AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
-- Qualquer usuário autenticado pode criar organização (signup)
|
||||
CREATE POLICY "Usuários autenticados podem criar organização" ON public.organizacoes
|
||||
FOR INSERT WITH CHECK (auth.uid() IS NOT NULL);
|
||||
|
||||
-- ========================================
|
||||
-- POLÍTICAS PARA USUÁRIOS
|
||||
-- ========================================
|
||||
|
||||
-- Usuários veem outros usuários da mesma organização
|
||||
CREATE POLICY "Usuários veem membros da organização" ON public.usuarios
|
||||
FOR SELECT USING (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid() AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
-- Usuários podem atualizar próprio perfil
|
||||
CREATE POLICY "Usuários podem atualizar próprio perfil" ON public.usuarios
|
||||
FOR UPDATE USING (id = auth.uid());
|
||||
|
||||
-- Admins e owners podem inserir novos usuários
|
||||
CREATE POLICY "Admins podem criar usuários" ON public.usuarios
|
||||
FOR INSERT WITH CHECK (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid()
|
||||
AND role IN ('owner', 'admin')
|
||||
AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
-- ========================================
|
||||
-- POLÍTICAS PARA ORGANIZACAO_USUARIOS
|
||||
-- ========================================
|
||||
|
||||
-- Usuários veem membros da própria organização
|
||||
CREATE POLICY "Ver membros da organização" ON public.organizacao_usuarios
|
||||
FOR SELECT USING (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid() AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
-- Owners e admins podem gerenciar membros
|
||||
CREATE POLICY "Admins gerenciam membros" ON public.organizacao_usuarios
|
||||
FOR ALL USING (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid()
|
||||
AND role IN ('owner', 'admin')
|
||||
AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
-- ========================================
|
||||
-- POLÍTICAS PARA CONVITES
|
||||
-- ========================================
|
||||
|
||||
-- Membros da organização veem convites
|
||||
CREATE POLICY "Ver convites da organização" ON public.convites
|
||||
FOR SELECT USING (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid() AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
-- Admins podem criar convites
|
||||
CREATE POLICY "Admins criam convites" ON public.convites
|
||||
FOR INSERT WITH CHECK (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid()
|
||||
AND role IN ('owner', 'admin')
|
||||
AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
-- Admins podem atualizar/cancelar convites
|
||||
CREATE POLICY "Admins gerenciam convites" ON public.convites
|
||||
FOR UPDATE USING (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid()
|
||||
AND role IN ('owner', 'admin')
|
||||
AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
-- ========================================
|
||||
-- POLÍTICAS PARA OBRAS
|
||||
-- ========================================
|
||||
|
||||
-- Usuários veem obras da organização
|
||||
CREATE POLICY "Ver obras da organização" ON public.obras
|
||||
FOR SELECT USING (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid() AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
-- Engenheiros, admins e owners podem criar obras
|
||||
CREATE POLICY "Engenheiros criam obras" ON public.obras
|
||||
FOR INSERT WITH CHECK (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid()
|
||||
AND role IN ('owner', 'admin', 'engenheiro')
|
||||
AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
-- Responsáveis, engenheiros, admins e owners podem atualizar obras
|
||||
CREATE POLICY "Responsáveis atualizam obras" ON public.obras
|
||||
FOR UPDATE USING (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid()
|
||||
AND (
|
||||
role IN ('owner', 'admin', 'engenheiro')
|
||||
OR usuario_id = responsavel_id
|
||||
)
|
||||
AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
-- Apenas admins e owners podem deletar obras
|
||||
CREATE POLICY "Admins deletam obras" ON public.obras
|
||||
FOR DELETE USING (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid()
|
||||
AND role IN ('owner', 'admin')
|
||||
AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
-- ========================================
|
||||
-- POLÍTICAS PARA RDOs
|
||||
-- ========================================
|
||||
|
||||
-- Usuários veem RDOs da organização
|
||||
CREATE POLICY "Ver RDOs da organização" ON public.rdos
|
||||
FOR SELECT USING (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid() AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
-- Usuários podem criar RDOs em obras da organização
|
||||
CREATE POLICY "Criar RDOs" ON public.rdos
|
||||
FOR INSERT WITH CHECK (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid() AND ativo = true
|
||||
)
|
||||
AND criado_por = auth.uid()
|
||||
);
|
||||
|
||||
-- Criadores podem atualizar próprios RDOs em rascunho
|
||||
-- Engenheiros e admins podem atualizar qualquer RDO
|
||||
CREATE POLICY "Atualizar RDOs" ON public.rdos
|
||||
FOR UPDATE USING (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid()
|
||||
AND (
|
||||
role IN ('owner', 'admin', 'engenheiro')
|
||||
OR (criado_por = auth.uid() AND status = 'rascunho')
|
||||
)
|
||||
AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
-- Apenas admins podem deletar RDOs
|
||||
CREATE POLICY "Admins deletam RDOs" ON public.rdos
|
||||
FOR DELETE USING (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid()
|
||||
AND role IN ('owner', 'admin')
|
||||
AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
-- ========================================
|
||||
-- POLÍTICAS PARA TABELAS RELACIONADAS AO RDO
|
||||
-- ========================================
|
||||
|
||||
-- Política genérica para todas as tabelas filhas do RDO
|
||||
-- Acesso baseado no acesso ao RDO pai
|
||||
|
||||
CREATE POLICY "Acesso via RDO - atividades" ON public.rdo_atividades
|
||||
FOR ALL USING (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid() AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
CREATE POLICY "Acesso via RDO - mao_obra" ON public.rdo_mao_obra
|
||||
FOR ALL USING (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid() AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
CREATE POLICY "Acesso via RDO - equipamentos" ON public.rdo_equipamentos
|
||||
FOR ALL USING (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid() AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
CREATE POLICY "Acesso via RDO - ocorrencias" ON public.rdo_ocorrencias
|
||||
FOR ALL USING (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid() AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
CREATE POLICY "Acesso via RDO - anexos" ON public.rdo_anexos
|
||||
FOR ALL USING (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid() AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
CREATE POLICY "Acesso via RDO - inspecoes" ON public.rdo_inspecoes_solda
|
||||
FOR ALL USING (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid() AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
CREATE POLICY "Acesso via RDO - verificacoes" ON public.rdo_verificacoes_torque
|
||||
FOR ALL USING (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid() AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
-- ========================================
|
||||
-- POLÍTICAS PARA TAREFAS
|
||||
-- ========================================
|
||||
|
||||
-- Usuários veem tarefas da organização
|
||||
CREATE POLICY "Ver tarefas da organização" ON public.tarefas
|
||||
FOR SELECT USING (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid() AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
-- Usuários podem criar tarefas
|
||||
CREATE POLICY "Criar tarefas" ON public.tarefas
|
||||
FOR INSERT WITH CHECK (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid() AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
-- Responsáveis e superiores podem atualizar tarefas
|
||||
CREATE POLICY "Atualizar tarefas" ON public.tarefas
|
||||
FOR UPDATE USING (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid()
|
||||
AND (
|
||||
role IN ('owner', 'admin', 'engenheiro')
|
||||
OR usuario_id = responsavel_id
|
||||
)
|
||||
AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
-- Apenas admins podem deletar tarefas
|
||||
CREATE POLICY "Admins deletam tarefas" ON public.tarefas
|
||||
FOR DELETE USING (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid()
|
||||
AND role IN ('owner', 'admin')
|
||||
AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
-- ========================================
|
||||
-- POLÍTICAS PARA TASK_LOGS
|
||||
-- ========================================
|
||||
|
||||
-- Usuários veem logs de tarefas da organização
|
||||
CREATE POLICY "Ver logs da organização" ON public.task_logs
|
||||
FOR SELECT USING (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid() AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
-- Usuários podem criar logs
|
||||
CREATE POLICY "Criar logs" ON public.task_logs
|
||||
FOR INSERT WITH CHECK (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid() AND ativo = true
|
||||
)
|
||||
AND usuario_id = auth.uid()
|
||||
);
|
||||
|
||||
-- ========================================
|
||||
-- POLÍTICAS PARA MÉTRICAS
|
||||
-- ========================================
|
||||
|
||||
-- Apenas admins e owners veem métricas
|
||||
CREATE POLICY "Admins veem métricas" ON public.organizacao_metricas
|
||||
FOR SELECT USING (
|
||||
organizacao_id IN (
|
||||
SELECT organizacao_id
|
||||
FROM public.organizacao_usuarios
|
||||
WHERE usuario_id = auth.uid()
|
||||
AND role IN ('owner', 'admin')
|
||||
AND ativo = true
|
||||
)
|
||||
);
|
||||
|
||||
-- Sistema pode atualizar métricas (via triggers)
|
||||
CREATE POLICY "Sistema atualiza métricas" ON public.organizacao_metricas
|
||||
FOR ALL USING (true);
|
||||
|
||||
-- ========================================
|
||||
-- PERMISSÕES PARA ROLES
|
||||
-- ========================================
|
||||
|
||||
-- Garantir permissões para roles anon e authenticated
|
||||
GRANT USAGE ON SCHEMA public TO anon, authenticated;
|
||||
GRANT ALL ON ALL TABLES IN SCHEMA public TO authenticated;
|
||||
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO authenticated;
|
||||
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO authenticated;
|
||||
|
||||
-- Permissões específicas para anon (apenas leitura limitada)
|
||||
GRANT SELECT ON public.organizacoes TO anon;
|
||||
GRANT SELECT ON public.convites TO anon;
|
||||
|
||||
-- ========================================
|
||||
-- COMENTÁRIOS
|
||||
-- ========================================
|
||||
|
||||
COMMENT ON POLICY "Usuários veem suas organizações" ON public.organizacoes IS
|
||||
'Usuários só podem ver organizações onde são membros ativos';
|
||||
|
||||
COMMENT ON POLICY "Ver obras da organização" ON public.obras IS
|
||||
'Isolamento multi-tenant: usuários só veem obras da própria organização';
|
||||
|
||||
COMMENT ON POLICY "Ver RDOs da organização" ON public.rdos IS
|
||||
'Isolamento multi-tenant: usuários só veem RDOs da própria organização';
|
||||
|
||||
COMMENT ON POLICY "Atualizar RDOs" ON public.rdos IS
|
||||
'Criadores podem editar RDOs em rascunho, engenheiros e admins podem editar qualquer RDO';
|
||||
Reference in New Issue
Block a user