202 lines
6 KiB
SQL
202 lines
6 KiB
SQL
-- ============================================================================
|
|
-- 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
|