Skip to content

[Nom de la Configuration Studio]

Type de ressource : Configuration Sanity Studio (RĂŽles / Permissions / Plugins)
Fichier source : sanity-studio/sanity.config.ts ou configuration associée
Statut : [Actif / Déprécié / En développement]

[Description concise de cette configuration Studio et son rÎle dans le workflow éditorial]

  • [Objectif principal : ex. dĂ©finir les rĂŽles et permissions pour les contributeurs]
  • [BĂ©nĂ©fice pour l’équipe Ă©ditoriale]
  • Environnements : [Development / Staging / Production]
  • Utilisateurs concernĂ©s : [Liste des rĂŽles : Administrator, Editor, Contributor, Viewer]
  • Types de documents impactĂ©s : [Liste : post, project, page, author, category, etc.]
[Utilisateur Sanity]
│ (authentification OAuth)
▌
[Sanity Studio]
│ ‱ VĂ©rification du rĂŽle
│ ‱ Application des permissions
│ ‱ Affichage de l'interface adaptĂ©e
▌
[Actions autorisées / restreintes]
Composant RĂŽle Couche
Sanity Studio Interface d’édition L1 (CMS)
Configuration des rÎles Définition des permissions L1 (Configuration)
OAuth Provider Authentification des utilisateurs Infrastructure
Variable Description Obligatoire Valeur par défaut
SANITY_PROJECT_ID ID du projet Sanity ✅ -
SANITY_DATASET Nom du dataset (ex: production) ✅ -
SANITY_AUTH_PROVIDERS Providers OAuth activĂ©s ❌ google,github
RĂŽle Droits principaux Public cible AccĂšs Studio
Administrator AccĂšs total (schĂ©mas, settings, tous les documents, gestion des utilisateurs) Équipe Architecture / Tech Lead ✅ Complet
Editor CrĂ©ation, modification et publication de tous les contenus (posts, projects, pages, authors, categories) Équipe Marketing / Contenu ✅ Complet
Contributor CrĂ©ation et modification de contenus, sans droit de publication (reste en draft) RĂ©dacteurs externes ou juniors ✅ Complet
Viewer Lecture seule Stakeholders / relecture ✅ Lecture seule
Type de document Administrator Editor Contributor Viewer
post (Article blog) ✅ CRUD + Publish ✅ CRUD + Publish ✅ Create + Update ✅ Read
project (Portfolio) ✅ CRUD + Publish ✅ CRUD + Publish ✅ Create + Update ✅ Read
page (Vitrine) ✅ CRUD + Publish ✅ CRUD + Publish ✅ Create + Update ✅ Read
author ✅ CRUD ✅ CRUD ❌ ✅ Read
category ✅ CRUD ✅ CRUD ❌ ✅ Read
schema (DĂ©finition) ✅ CRUD ❌ ❌ ❌
webhook (Configuration) ✅ CRUD ❌ ❌ ❌
// sanity-studio/sanity.config.ts (extrait)
export default defineConfig({
// ... configuration de base
document: {
actions: (prev, { draft, published, schemaType }) => {
// Exemple : restreindre la publication aux Editors et Administrators
if (schemaType === 'post') {
return prev.filter((action) => {
if (action.label === 'Publish') {
return currentUser.roles.some(role =>
['administrator', 'editor'].includes(role.name)
);
}
return true;
});
}
return prev;
},
},
});
Provider Configuration Obligatoire
Google OAuth Client ID + Secret via Sanity Dashboard ✅
GitHub OAuth Client ID + Secret via Sanity Dashboard ❌
Email/Password DĂ©sactivĂ© (recommandĂ©) ❌
  • ✅ Authentification obligatoire pour tous les utilisateurs
  • ✅ Seuls les emails de domaine autorisĂ© peuvent accĂ©der au Studio (si applicable)
  • ✅ Invitation des utilisateurs via Sanity Dashboard (Administrator uniquement)
  • ✅ RĂ©vocation d’accĂšs immĂ©diate possible depuis le Dashboard
sanity-studio/deskStructure.ts
import { StructureBuilder } from 'sanity/structure';
export const deskStructure = (S: StructureBuilder) =>
S.list()
.title('Contenu')
.items([
// Section Blog
S.listItem()
.title('Blog')
.child(
S.documentTypeList('post')
.title('Articles')
.filter('_type == "post"')
),
// Section Portfolio
S.listItem()
.title('Portfolio')
.child(
S.documentTypeList('project')
.title('Projets')
.filter('_type == "project"')
),
// Section Pages Vitrine
S.listItem()
.title('Pages Vitrine')
.child(
S.documentTypeList('page')
.title('Pages')
.filter('_type == "page"')
),
// Section Utilisateurs
S.listItem()
.title('Auteurs')
.child(S.documentTypeList('author').title('Auteurs')),
S.listItem()
.title('Catégories')
.child(S.documentTypeList('category').title('Catégories')),
// Séparateur
S.divider(),
// Documents systĂšme
...S.documentTypeListItems().filter(
listItem => !['post', 'project', 'page', 'author', 'category'].includes(listItem.getId()!)
),
]);
// Exemple de vue personnalisée pour les articles
S.documentTypeListItem('post').child(
S.document()
.schemaType('post')
.documentId('post-123')
.views([
S.view.form(),
S.view
.component(PreviewComponent)
.title('Preview'),
])
)
Plugin RĂŽle Version Obligatoire
@sanity/vision Éditeur GROQ pour tester les requĂȘtes Latest ❌
@sanity/asset-utils Gestion des mĂ©dias Latest ✅
[Autre plugin] [Rîle] [Version] [✅/❌]
sanity-studio/sanity.config.ts
import { visionTool } from '@sanity/vision';
export default defineConfig({
// ... configuration de base
plugins: [
visionTool(),
// Autres plugins
],
});
Mécanisme Implémentation Rationale
Authentification OAuth Google / GitHub Évite les mots de passe faibles
RĂŽles granulaires Matrice de permissions ContrĂŽle d’accĂšs prĂ©cis
Restrictions de publication Filtres sur les actions EmpĂȘche les publications non autorisĂ©es
Audit logs Sanity Dashboard Traçabilité des modifications
  • ✅ Les Administrators sont les seuls Ă  pouvoir modifier les schĂ©mas et configurer les webhooks
  • ✅ Les Contributors ne peuvent pas publier (restent en draft)
  • ✅ Les Viewers ont un accĂšs en lecture seule
  • ✅ Les tokens d’API sont gĂ©nĂ©rĂ©s avec les permissions minimales nĂ©cessaires
  • ✅ Les utilisateurs inactifs sont rĂ©voquĂ©s rĂ©guliĂšrement (tous les 90 jours recommandĂ©)
Token Permissions Généré par Stockage
SANITY_API_READ_TOKEN Lecture des drafts Administrator Cloudflare Secrets
SANITY_API_WRITE_TOKEN Écriture (mutations) Administrator Cloudflare Secrets
SANITY_ADMIN_TOKEN AccĂšs total (backups, exports) Administrator Cloudflare Secrets
[CrĂ©ation] → [Draft] → [Relecture] → [Publication] → [ArchivĂ©]
│ │ │ │ │
▌ ▌ ▌ ▌ ▌
Contributor Contributor Editor/Viewer Public Administrator
  • ✅ Toujours remplir les champs SEO (metaTitle, metaDescription, ogImage)
  • ✅ Utiliser le mode Preview avant publication
  • ✅ VĂ©rifier le rendu responsive (mobile, tablet, desktop)
  • ✅ Publier les modifications par lots plutĂŽt qu’une par une
  • ✅ Archiver les contenus obsolĂštes plutĂŽt que les supprimer
Étape Responsable Action
1. Rédaction Contributor Création du contenu en draft
2. Relecture Editor / Viewer Validation du contenu
3. Publication Editor / Administrator Publication finale
4. Vérification Editor Vérification post-publication (preview + live)
SymptĂŽme Cause probable Solution
“Permission denied” RĂŽle insuffisant VĂ©rifier les permissions dans Sanity Dashboard
Impossible de publier Utilisateur Contributor Demander Ă  un Editor de publier
Schéma non visible Cache Studio Vider le cache du navigateur
Plugin ne fonctionne pas Version incompatible Vérifier la compatibilité des plugins
Authentification échoue OAuth mal configuré Vérifier les Client ID/Secret dans Sanity Dashboard

CÎté Sanity :

  • Sanity Dashboard → Settings → Activity → Audit logs
  • VĂ©rifier les actions des utilisateurs (crĂ©ation, modification, publication)

CÎté application :

  • Logs des webhooks (voir /sanity/webhooks/)
  • Logs des erreurs de build (CI/CD)
Terminal window
# Test de requĂȘte GROQ avec diffĂ©rents tokens
# Token lecture seule
curl "https://[project-id].api.sanity.io/v2025-01-01/data/query/production?query=*[_type=='post'][0]" \
-H "Authorization: Bearer [read-token]"
# Token écriture (si disponible)
curl -X POST "https://[project-id].api.sanity.io/v2025-01-01/data/mutate/production" \
-H "Authorization: Bearer [write-token]" \
-H "Content-Type: application/json" \
-d '{"mutations": [{"create": {"_type": "post", "title": "Test"}}]}'
  • ✅ Configurer les rĂŽles et permissions avant d’inviter des utilisateurs
  • ✅ Documenter les changements de configuration dans ce fichier
  • ✅ RĂ©voquer les accĂšs des utilisateurs partis
  • ✅ Rotation rĂ©guliĂšre des tokens API (tous les 90 jours)
  • ✅ Tester les permissions en se connectant avec diffĂ©rents rĂŽles
  • ✅ Valider les contenus avant publication
  • ✅ Utiliser le mode Preview systĂ©matiquement
  • ✅ VĂ©rifier le SEO (metaTitle, metaDescription, ogImage)
  • ✅ Archiver les contenus obsolĂštes
  • ✅ CrĂ©er des drafts complets (tous les champs obligatoires remplis)
  • ✅ Ne pas publier (demander Ă  un Editor)
  • ✅ Utiliser le mode Preview pour vĂ©rifier le rendu
  • ✅ Signaler les problĂšmes techniques aux Administrators
  • ⚠ Le Studio peut ĂȘtre lent avec beaucoup de documents (> 10 000)
  • ⚠ Les images lourdes peuvent ralentir l’édition
  • ✅ Utiliser des filtres dans le Desk pour naviguer plus rapidement
  • ✅ Optimiser les images avant upload (max 2 MB recommandĂ©)
  • [Évolution 1 : ex. Ajout d’un plugin de traduction]
  • [Évolution 2 : ex. IntĂ©gration d’un workflow de validation multi-niveaux]
  • [Évolution 3 : ex. Personnalisation avancĂ©e du Desk]
  • ❌ Le Studio ne supporte pas nativement le versioning avancĂ© (historique limitĂ©)
  • ❌ Les permissions granulaires nĂ©cessitent du code custom (actions filtrĂ©es)
  • ❌ Le mode offline n’est pas supportĂ©
  • Documentation Sanity : Roles & Permissions
  • Documentation Sanity : Studio Configuration
  • DAT L1 : §4.9.1 - RĂŽles et permissions dans Sanity Studio
  • DAT L1 : §4.9.3 - Alerting Webhook & OpĂ©rations
  • Fichiers concernĂ©s :
    • sanity-studio/sanity.config.ts
    • sanity-studio/deskStructure.ts (si applicable)
    • Configuration Sanity Dashboard → Settings → Members
Date Version Description Auteur
YYYY-MM-DD 1.0 Création initiale [Nom]
YYYY-MM-DD 1.1 [Modification] [Nom]
Edit page

Last updated: