Aller au contenu

Policies & Permissions

ArtisanCMS utilise le système d’autorisation de Laravel (Policies et Gates) enrichi d’un système de permissions granulaires basé sur des rôles. Les 22 policies couvrent l’ensemble des ressources du CMS.

Les permissions suivent le format module.action et sont stockées en JSON dans la colonne permissions du modèle Role.

// Exemples de permissions
'pages.create' // Créer une page
'pages.edit' // Modifier une page
'pages.delete' // Supprimer une page
'pages.publish' // Publier une page
'posts.create' // Créer un article
'media.upload' // Uploader un média
'users.manage' // Gérer les utilisateurs
'settings.edit' // Modifier les paramètres

Le caractère * permet d’accorder toutes les actions d’un module.

// Toutes les permissions sur les pages
'pages.*'
// Toutes les permissions sur tous les modules (super admin)
'*'
PermissionDescription
pages.viewVoir les pages dans l’administration
pages.createCréer une nouvelle page
pages.editModifier une page existante
pages.deleteSupprimer une page
pages.publishPublier ou dépublier une page
posts.viewVoir les articles
posts.createCréer un article
posts.editModifier un article
posts.deleteSupprimer un article
posts.publishPublier un article
content_types.manageGérer les types de contenu personnalisés
PermissionDescription
media.viewVoir la bibliothèque de médias
media.uploadUploader des fichiers
media.editModifier les métadonnées
media.deleteSupprimer des médias
PermissionDescription
users.viewVoir la liste des utilisateurs
users.createCréer un utilisateur
users.editModifier un utilisateur
users.deleteSupprimer un utilisateur
users.manageGérer les rôles et permissions
PermissionDescription
themes.manageInstaller et activer des thèmes
menus.manageGérer les menus de navigation
widgets.manageGérer les widgets
design.editModifier les tokens de design
branding.editModifier le branding
PermissionDescription
plugins.manageInstaller et gérer les plugins
settings.viewVoir les paramètres
settings.editModifier les paramètres
redirects.manageGérer les redirections SEO
analytics.viewConsulter les statistiques
comments.moderateModérer les commentaires
newsletters.manageGérer les newsletters
webhooks.manageGérer les webhooks
activity_log.viewConsulter le journal d’activité
forms.viewVoir les soumissions de formulaires
sites.manageGérer les sites (multi-site)

ArtisanCMS crée quatre rôles par défaut via le RoleSeeder.

RôlePermissionsDescription
Admin*Accès complet à toutes les fonctionnalités
Éditeurpages.*, posts.*, media.*, comments.moderate, menus.manageGestion complète du contenu
Auteurposts.create, posts.edit, media.view, media.uploadRédaction d’articles uniquement
Contributeurposts.create, media.viewCréation de brouillons sans publication
class Role extends Model
{
protected $table = 'cms_roles';
protected $casts = [
'permissions' => 'array',
];
public function hasPermission(string $permission): bool
{
$permissions = $this->permissions ?? [];
// Vérifier le wildcard global
if (in_array('*', $permissions)) {
return true;
}
// Vérifier le wildcard de module (pages.*)
$module = explode('.', $permission)[0];
if (in_array("{$module}.*", $permissions)) {
return true;
}
return in_array($permission, $permissions);
}
}

Les policies sont enregistrées dans AuthServiceProvider.

PolicyModèlePermissions utilisées
PagePolicyPagepages.*
PostPolicyPostposts.*
ContentTypePolicyContentTypecontent_types.manage
MediaPolicyMediamedia.*
MediaFolderPolicyMediaFoldermedia.*
UserPolicyUserusers.*
RolePolicyRoleusers.manage
MenuPolicyMenumenus.manage
MenuItemPolicyMenuItemmenus.manage
ThemePolicyThemethemes.manage
PluginPolicyPluginplugins.manage
SettingPolicySettingsettings.*
WidgetPolicyWidgetwidgets.manage
PopupPolicyPopuppages.edit
CommentPolicyCommentcomments.moderate
RedirectPolicyRedirectredirects.manage
TaxonomyPolicyTaxonomycontent_types.manage
NewsletterPolicyNewsletternewsletters.manage
WebhookPolicyWebhookwebhooks.manage
FormEntryPolicyFormEntryforms.view
DesignTokenPolicyDesignTokendesign.edit
BrandingPolicyBrandingbranding.edit
app/Providers/AuthServiceProvider.php
class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
Page::class => PagePolicy::class,
Post::class => PostPolicy::class,
Media::class => MediaPolicy::class,
// ... toutes les autres policies
];
}
class PageController extends Controller
{
public function edit(Page $page)
{
$this->authorize('update', $page);
return inertia('Pages/Edit', compact('page'));
}
public function destroy(Page $page)
{
$this->authorize('delete', $page);
$page->delete();
return redirect()->route('admin.pages.index')
->with('success', 'Page supprimée.');
}
}

Les plugins peuvent déclarer leurs propres permissions.

// Dans le ServiceProvider du plugin
public function boot(): void
{
// Enregistrer des permissions personnalisées
\CMS::registerPermissions('my-plugin', [
'my-plugin.view' => 'Voir les données du plugin',
'my-plugin.manage' => 'Gérer le plugin',
]);
}

Ces permissions apparaissent dans l’interface de gestion des rôles et peuvent être attribuées aux utilisateurs.

// Vérifier une permission de plugin dans un contrôleur
$this->authorize('viewAny', MyPluginResource::class);