-- ============================================================================ -- POLITIQUES RLS SÉCURISÉES POUR LA TABLE DOCUMENTS -- Date : 16 octobre 2025 -- ============================================================================ -- 1. Supprimer les anciennes politiques (si elles existent) DROP POLICY IF EXISTS documents_client_read ON documents; DROP POLICY IF EXISTS documents_staff_delete ON documents; DROP POLICY IF EXISTS documents_staff_insert ON documents; DROP POLICY IF EXISTS documents_staff_read ON documents; DROP POLICY IF EXISTS documents_staff_update ON documents; DROP POLICY IF EXISTS documents_system_delete ON documents; DROP POLICY IF EXISTS documents_system_insert ON documents; DROP POLICY IF EXISTS documents_system_update ON documents; -- 2. S'assurer que RLS est activé ALTER TABLE documents ENABLE ROW LEVEL SECURITY; -- ============================================================================ -- POLITIQUES CLIENTS (READ ONLY - Leur organisation uniquement) -- ============================================================================ CREATE POLICY "clients_can_read_own_org_documents" ON documents FOR SELECT TO authenticated USING ( -- Vérifier que l'utilisateur appartient à l'organisation du document org_id IN ( SELECT om.org_id FROM organization_members om WHERE om.user_id = auth.uid() AND om.revoked = false ) AND -- S'assurer que l'utilisateur n'est PAS staff NOT EXISTS ( SELECT 1 FROM staff_users su WHERE su.user_id = auth.uid() AND su.is_staff = true ) ); -- ============================================================================ -- POLITIQUES STAFF (Accès complet à toutes les organisations) -- ============================================================================ CREATE POLICY "staff_can_read_all_documents" ON documents FOR SELECT TO authenticated USING ( EXISTS ( SELECT 1 FROM staff_users su WHERE su.user_id = auth.uid() AND su.is_staff = true ) ); CREATE POLICY "staff_can_insert_documents" ON documents FOR INSERT TO authenticated WITH CHECK ( EXISTS ( SELECT 1 FROM staff_users su WHERE su.user_id = auth.uid() AND su.is_staff = true ) ); CREATE POLICY "staff_can_update_documents" ON documents FOR UPDATE TO authenticated USING ( EXISTS ( SELECT 1 FROM staff_users su WHERE su.user_id = auth.uid() AND su.is_staff = true ) ) WITH CHECK ( EXISTS ( SELECT 1 FROM staff_users su WHERE su.user_id = auth.uid() AND su.is_staff = true ) ); CREATE POLICY "staff_can_delete_documents" ON documents FOR DELETE TO authenticated USING ( EXISTS ( SELECT 1 FROM staff_users su WHERE su.user_id = auth.uid() AND su.is_staff = true ) ); -- ============================================================================ -- POLITIQUES SYSTÈME (Service Role uniquement - pour APIs backend) -- ============================================================================ -- Ces politiques permettent l'accès via le Service Role Key -- utilisé dans les APIs backend pour contourner RLS si nécessaire CREATE POLICY "system_can_read_all_documents" ON documents FOR SELECT TO service_role USING (true); CREATE POLICY "system_can_insert_documents" ON documents FOR INSERT TO service_role WITH CHECK (true); CREATE POLICY "system_can_update_documents" ON documents FOR UPDATE TO service_role USING (true) WITH CHECK (true); CREATE POLICY "system_can_delete_documents" ON documents FOR DELETE TO service_role USING (true); -- ============================================================================ -- VÉRIFICATION DES POLITIQUES -- ============================================================================ -- Lister toutes les politiques sur la table documents SELECT schemaname, tablename, policyname, permissive, roles, cmd, qual, with_check FROM pg_policies WHERE tablename = 'documents' ORDER BY policyname; -- ============================================================================ -- TESTS DES POLITIQUES -- ============================================================================ -- Test 1 : Vérifier qu'un client ne peut voir que les documents de son org -- (Exécuter en tant que client via l'interface Supabase) -- SELECT * FROM documents; -- → Devrait retourner uniquement les documents de son organisation -- Test 2 : Vérifier qu'un staff peut voir tous les documents -- (Exécuter en tant que staff) -- SELECT * FROM documents; -- → Devrait retourner tous les documents -- Test 3 : Vérifier qu'un client ne peut pas insérer de documents -- (Exécuter en tant que client) -- INSERT INTO documents (org_id, category, filename) VALUES ('uuid', 'test', 'test.pdf'); -- → Devrait échouer avec une erreur de permission -- ============================================================================ -- MIGRATION NOTES -- ============================================================================ -- 1. Exécuter ce script dans l'éditeur SQL de Supabase Dashboard -- 2. Vérifier qu'aucune erreur n'apparaît -- 3. Tester les accès avec un compte client et un compte staff -- 4. Si tout fonctionne, déployer les changements dans l'API -- ============================================================================ -- ROLLBACK (En cas de problème) -- ============================================================================ -- Pour revenir aux anciennes politiques, exécuter : -- DROP POLICY IF EXISTS clients_can_read_own_org_documents ON documents; -- DROP POLICY IF EXISTS staff_can_read_all_documents ON documents; -- DROP POLICY IF EXISTS staff_can_insert_documents ON documents; -- DROP POLICY IF EXISTS staff_can_update_documents ON documents; -- DROP POLICY IF EXISTS staff_can_delete_documents ON documents; -- DROP POLICY IF EXISTS system_can_read_all_documents ON documents; -- DROP POLICY IF EXISTS system_can_insert_documents ON documents; -- DROP POLICY IF EXISTS system_can_update_documents ON documents; -- DROP POLICY IF EXISTS system_can_delete_documents ON documents; -- Puis recréer les anciennes politiques si nécessaire