Aller au contenu

Autorisations

ArtisanCMS implemente un systeme de controle d’acces base sur les roles (RBAC) avec des permissions granulaires couvrant l’ensemble des ressources du CMS.

Le systeme repose sur trois entites : Utilisateur (possede un ou plusieurs roles), Role (regroupe des permissions) et Permission (autorise une action sur un module).

class Role extends Model
{
protected $casts = [
'permissions' => 'array', // Colonne JSON contenant les permissions
];
public function hasPermission(string $permission): bool
{
$permissions = $this->permissions ?? [];
$module = Str::before($permission, '.');
// Support du wildcard : 'pages.*' accorde toutes les actions
if (in_array("{$module}.*", $permissions)) {
return true;
}
return in_array($permission, $permissions);
}
}

Les permissions suivent le format module.action. Liste complete :

ModulePermissions
Pagespages.create, pages.read, pages.update, pages.delete, pages.publish
Articlesposts.create, posts.read, posts.update, posts.delete, posts.publish
Mediasmedia.upload, media.read, media.update, media.delete
Taxonomiestaxonomies.create, taxonomies.read, taxonomies.update, taxonomies.delete
Menusmenus.create, menus.read, menus.update, menus.delete
Utilisateursusers.create, users.read, users.update, users.delete
Rolesroles.create, roles.read, roles.update, roles.delete
Parametressettings.read, settings.update
Pluginsplugins.install, plugins.activate, plugins.deactivate, plugins.delete, plugins.settings
Themesthemes.activate, themes.customize, themes.delete
Webhookswebhooks.create, webhooks.read, webhooks.update, webhooks.delete
Analyticsanalytics.read
Systemesystem.read, system.update

Le wildcard module.* accorde toutes les actions d’un module en une seule permission.

RolePermissionsDescription
Super AdminToutes (*.*)Acces total, role non suppressible
AdminPresque toutesAdministration complete sauf gestion du Super Admin
Editorpages.*, posts.*, media.*, menus.*, taxonomies.*Gestion et publication de tout le contenu
Authorposts.create/read/update, media.upload/readCreation et gestion de son propre contenu
Contributorposts.create/read, media.upload/readBrouillons et soumission pour relecture
Subscriberposts.read, pages.readConsultation du contenu restreint

ArtisanCMS definit une policy par entite dans app/Policies/ : Page, Post, Media, User, Role, Menu, Taxonomy, Setting, Plugin, Theme, Webhook, Block, Comment, Navigation, Newsletter, Site, Analytics, Form, Redirect, ActivityLog, ContentType et CustomField.

class PagePolicy
{
public function create(User $user): bool
{
return $user->hasPermission('pages.create');
}
public function update(User $user, Page $page): bool
{
return $user->hasPermission('pages.update');
}
public function delete(User $user, Page $page): bool
{
return $user->hasPermission('pages.delete');
}
}

Les policies sont appliquees via la methode authorize() :

class PageController extends Controller
{
public function store(StorePageRequest $request)
{
$this->authorize('create', Page::class);
// Logique de creation...
}
public function destroy(Page $page)
{
$this->authorize('delete', $page);
// Logique de suppression...
}
}

Le middleware EnsureAdmin protege toutes les routes d’administration :

class EnsureAdmin
{
public function handle(Request $request, Closure $next): Response
{
if (! $request->user()?->isAdmin()) {
abort(403, 'Acces non autorise.');
}
return $next($request);
}
}

Il est applique au groupe de routes admin dans routes/web.php :

Route::prefix(config('cms.admin_prefix'))
->middleware(['auth', 'verified', EnsureAdmin::class])
->group(function () {
// Toutes les routes d'administration
});