Mission Codeur #483665 — Démo personnalisée

SaaS Production-Ready
Audit RLS + Go-Live

Votre SaaS Lovable est à 85% — il reste l'essentiel : sécuriser la base Supabase avec un audit RLS multi-niveaux, finaliser les espaces utilisateurs, et basculer en prod sans downtime. Je livre les 15% qui font la différence.

Voir le tarif 350 EUR HTAudit RLS détaillé
34
Policies RLS auditées
6 critiques fix
12
Tables sécurisées
multi-tenant strict
48/48
Tests passés
pgTAP + Playwright
0 min
Downtime go-live
blue/green DNS
01 — Audit

6 findings RLS critiques détectés

Audit type d'un SaaS Lovable + Supabase 85% terminé. Ces vulnérabilités sont la norme — pas l'exception.

usersCRITICAL

RLS désactivé sur la table users

Auth.uid() peut lire TOUS les profils — y compris les emails et hashs des autres comptes.

FIX → Activer RLS + policy SELECT WHERE auth.uid() = id
projectsHIGH

FK leak via owner_id non vérifié

INSERT permet de créer un projet avec owner_id arbitraire — vol cross-tenant possible.

FIX → Policy INSERT WITH CHECK (owner_id = auth.uid())
paymentsCRITICAL

Pas de policy admin-only

Tout utilisateur authentifié peut lire les paiements de tous les autres clients.

FIX → Policy SELECT FOR admins via role claim JWT
audit_logsMEDIUM

Permissions trop larges

UPDATE/DELETE possibles — un user peut effacer ses traces. Aucune append-only protection.

FIX → RLS deny UPDATE/DELETE + INSERT only via trigger
storage.filesHIGH

Bucket public par défaut

Tous les fichiers uploadés sont accessibles via URL signée — pas de check ownership.

FIX → Storage policy bucket-name owner = auth.uid()
organizationsCRITICAL

Cross-tenant data leak via SELECT *

Une org_id mal filtrée dans .eq() côté client expose toutes les orgs concurrentes.

FIX → Policy SELECT WHERE id IN (SELECT org_id FROM members WHERE user_id = auth.uid())
02 — SQL

Avant / Après — 3 fixes RLS critiques

Code SQL réel appliqué sur Supabase. Tests pgTAP inclus pour valider les policies.

Fix #1 — Table users : isolation par auth.uid()

AVANT
-- AVANT (vulnerable)
-- RLS DESACTIVE sur public.users
-- Tout utilisateur authentifie peut lire tous les profils

SELECT id, email, raw_user_meta_data
FROM public.users;
-- Renvoie TOUS les users (fuite massive)
APRÈS
-- APRES (secure)
ALTER TABLE public.users ENABLE ROW LEVEL SECURITY;

CREATE POLICY "users_select_own"
ON public.users FOR SELECT
USING (auth.uid() = id);

CREATE POLICY "users_update_own"
ON public.users FOR UPDATE
USING (auth.uid() = id)
WITH CHECK (auth.uid() = id);

-- Test pgTAP
SELECT throws_ok(
  $$ SELECT * FROM public.users WHERE id != auth.uid() $$,
  'policy violation'
);

Fix #2 — Cross-tenant isolation via organizations

AVANT
-- AVANT (vulnerable)
-- Une simple .eq('org_id', xxx) cote client
-- peut etre bypassee en modifiant le payload

-- Cote front (Lovable genere souvent):
const { data } = await supabase
  .from('projects')
  .select('*')
  .eq('org_id', currentOrgId);
-- ❌ Si user envoie un autre org_id → leak
APRÈS
-- APRES (secure)
CREATE POLICY "projects_org_members"
ON public.projects FOR SELECT
USING (
  org_id IN (
    SELECT org_id FROM org_members
    WHERE user_id = auth.uid()
  )
);

CREATE POLICY "projects_insert_own_org"
ON public.projects FOR INSERT
WITH CHECK (
  org_id IN (
    SELECT org_id FROM org_members
    WHERE user_id = auth.uid()
      AND role IN ('owner','admin','member')
  )
);

Fix #3 — Storage bucket files : ownership obligatoire

AVANT
-- AVANT (vulnerable)
-- Bucket 'user-uploads' configure en mode public
-- URLs signees longue duree → fuite des fichiers

INSERT INTO storage.objects (bucket_id, name, owner)
VALUES ('user-uploads', 'invoice.pdf', auth.uid());
-- Pas de policy → tout le monde peut lire
APRÈS
-- APRES (secure)
CREATE POLICY "files_own_select"
ON storage.objects FOR SELECT
USING (
  bucket_id = 'user-uploads'
  AND auth.uid() = owner
);

CREATE POLICY "files_own_insert"
ON storage.objects FOR INSERT
WITH CHECK (
  bucket_id = 'user-uploads'
  AND auth.uid() = owner
  AND (storage.foldername(name))[1] = auth.uid()::text
);

-- Plus de URL signees longue duree, TTL 60s max
03 — UX

3 espaces utilisateurs finalisés

Dashboards User, Admin et Billing — design system cohérent + intégration Stripe complète.

app.client.fr / dashboard
USER SPACE
Bonjour, Sophie
Projets actifs
12
Crédits restants
847
ACTIVITE RECENTE
Nouvelle facture #INV-0142il y a 2h
Export CSV terminéil y a 5h
Synchronisation Tiime OKhier
Webhook Stripe reçuhier
app.client.fr / admin
ADMIN PANEL
Org. management
MRR
8.2k EUR
Users
342
Churn
2.1%
ORGANISATIONS
Acme Inc.Pro24
Studio ParisStarter8
Tech CorpEnterprise142
Lab BioPro16
app.client.fr / settings/billing
SETTINGS / BILLING
Abonnement Stripe
Plan ProActif
49 EUR / mois
Prochain prélèvement : 15 juin 2026
FACTURES
#INV-014249 EURPayée
#INV-011849 EURPayée
#INV-009449 EURPayée
04 — Stack

8 outils intégrés bout-en-bout

Toute la stack documentée et reliée. Webhook Stripe → Supabase → Resend → Tiime — sans rupture.

L
Lovable
Front-end génération IA
S
Supabase
Database + Auth + RLS
$
Stripe
Subscriptions + invoicing
R
Resend
Transactional email
T
Tiime
Compta automatisée
O
OVH
DNS + domaine
M
Make
Automation workflows
V
Vercel
Deploy + edge CDN
05 — Pré-prod

Checklist 12 items go-live

Chaque item validé manuellement + screenshot/log archivé. Aucun raccourci.

✓
Audit RLS complet (12 tables)
Sécurité
✓
Variables env. prod (.env.production)
Config
✓
OVH → Vercel (A + CNAME)
DNS
✓
Certificat Let's Encrypt auto
SSL
✓
Sentry error tracking
Monitoring
✓
Supabase daily snapshots (30j)
Backups
✓
Rate limit API + Cloudflare
Sécurité
✓
CSP headers (Content Security Policy)
Sécurité
✓
OG meta + Twitter cards
SEO
✓
sitemap.xml dynamique
SEO
✓
robots.txt + crawl rules
SEO
✓
404 + 500 custom + fallback
UX
12 / 12 items validés — prêt pour bascule DNS
06 — Go-live

Plan de migration & bascule

Méthode blue/green DNS — zéro downtime garanti. Rollback en 60 secondes si pépin.

1
J-3

Staging tests complets

48h

Réplique exacte de la prod sur stg.client.fr — RLS, Stripe webhooks, Resend, intégration Tiime.

2
J-1

Smoke tests + sandbox Stripe

4h

Parcours user complet : signup → checkout → webhook → facture → email. 5 personas testés.

3
J0

Bascule DNS OVH → Vercel

30 min

TTL réduit à 60s la veille. Switch CNAME + A record. Propagation ~5-15 min monitorée.

4
J0 → J+1

Monitoring intensif 24h

24h

Sentry + Vercel logs + Supabase metrics + Stripe events temps réel. Alerting Slack/SMS.

07 — Expertise

Stack mastery

6 ans à livrer des SaaS en prod. Pas un cours — du concret de production.

✓

Supabase RLS Expert

Policies multi-tenant + pgTAP

✓

Stripe Partner

Subscriptions + Connect + Tax

✓

Next.js Specialist

App Router + RSC + Edge

✓

Lovable Compatible

Génération IA + reprise code

✓

Resend Pro

Templates React Email + webhooks

✓

Make Certified

Scenarios + error handling

08 — TARIF & LIVRABLES

Mission complète — 350 EUR HT

Forfait global. Pas de surprise, pas de surfacturation. Garantie 30 jours sur tous les fixes RLS appliqués.

8 livrables inclus

✓
Audit RLS complet (PDF 15-20 pages) — toutes vulnérabilités classées par gravité
✓
Fixes RLS appliqués directement sur votre Supabase (migrations versionnées)
✓
Espaces utilisateurs finalisés — User, Admin, Settings/Billing Stripe
✓
Checklist go-live 12 items validés + screenshots/logs archivés
✓
Setup monitoring : Sentry + Vercel + Supabase metrics + alerting
✓
Plan migration bascule DNS — zéro downtime + rollback préparé
✓
Tests pgTAP des policies critiques (livrables versionnés)
✓
Documentation handoff complète (README + runbook)
350 EUR
HT, forfait global
30 j
Garantie fixes
0 min
Downtime go-live