Reference

API Permissions Reference

> **What you'll learn:** How Shield permissions work with the REST API and how to configure roles for API access.


Overview

The TallCMS API uses a dual authorization system:

LayerPurposeConfigured In
Token AbilitiesScopes what the token can doToken creation request
Shield PermissionsScopes what the user can doAdmin panel (Shield)

Both layers must authorize a request for it to succeed.


Permission Mapping

Pages

API EndpointToken AbilityShield Permission
GET /pagespages:readViewAny:CmsPage
GET /pages/{id}pages:readView:CmsPage
GET /pages/{id}/revisionspages:readViewRevisions:CmsPage
POST /pagespages:writeCreate:CmsPage
PUT /pages/{id}pages:writeUpdate:CmsPage
POST /pages/{id}/publishpages:writeUpdate:CmsPage
POST /pages/{id}/unpublishpages:writeUpdate:CmsPage
POST /pages/{id}/submit-for-reviewpages:writeSubmitForReview:CmsPage
POST /pages/{id}/approvepages:writeApprove:CmsPage
POST /pages/{id}/rejectpages:writeApprove:CmsPage
POST /pages/{id}/restorepages:writeRestore:CmsPage
POST /pages/{id}/revisions/{rev}/restorepages:writeRestoreRevision:CmsPage
DELETE /pages/{id}pages:deleteDelete:CmsPage
DELETE /pages/{id}/forcepages:deleteForceDelete:CmsPage

Posts

API EndpointToken AbilityShield Permission
GET /postsposts:readViewAny:CmsPost
GET /posts/{id}posts:readView:CmsPost
GET /posts/{id}/revisionsposts:readViewRevisions:CmsPost
POST /postsposts:writeCreate:CmsPost
PUT /posts/{id}posts:writeUpdate:CmsPost
POST /posts/{id}/publishposts:writeUpdate:CmsPost
POST /posts/{id}/unpublishposts:writeUpdate:CmsPost
POST /posts/{id}/submit-for-reviewposts:writeSubmitForReview:CmsPost
POST /posts/{id}/approveposts:writeApprove:CmsPost
POST /posts/{id}/rejectposts:writeApprove:CmsPost
POST /posts/{id}/restoreposts:writeRestore:CmsPost
POST /posts/{id}/revisions/{rev}/restoreposts:writeRestoreRevision:CmsPost
DELETE /posts/{id}posts:deleteDelete:CmsPost
DELETE /posts/{id}/forceposts:deleteForceDelete:CmsPost

Categories

API EndpointToken AbilityShield Permission
GET /categoriescategories:readViewAny:CmsCategory
GET /categories/{id}categories:readView:CmsCategory
GET /categories/{id}/postscategories:readView:CmsCategory
POST /categoriescategories:writeCreate:CmsCategory
PUT /categories/{id}categories:writeUpdate:CmsCategory
DELETE /categories/{id}categories:deleteDelete:CmsCategory

Media

API EndpointToken AbilityShield Permission
GET /mediamedia:readViewAny:TallcmsMedia
GET /media/{id}media:readView:TallcmsMedia
GET /media/collectionsmedia:readViewAny:TallcmsMedia
GET /media/collections/{id}media:readViewAny:TallcmsMedia
POST /mediamedia:writeCreate:TallcmsMedia
POST /media/collectionsmedia:writeCreate:TallcmsMedia
PUT /media/{id}media:writeUpdate:TallcmsMedia
PUT /media/collections/{id}media:writeCreate:TallcmsMedia
DELETE /media/{id}media:deleteDelete:TallcmsMedia
DELETE /media/collections/{id}media:deleteCreate:TallcmsMedia

Webhooks

API EndpointToken AbilityShield Permission
GET /webhookswebhooks:manageViewAny:Webhook
GET /webhooks/{id}webhooks:manageView:Webhook
POST /webhookswebhooks:manageCreate:Webhook
PUT /webhooks/{id}webhooks:manageUpdate:Webhook
DELETE /webhooks/{id}webhooks:manageDelete:Webhook
POST /webhooks/{id}/testwebhooks:manageUpdate:Webhook

Required Permissions by Role

API Reader Role

Minimum permissions for read-only API access:

ViewAny:CmsPage
View:CmsPage
ViewAny:CmsPost
View:CmsPost
ViewAny:CmsCategory
View:CmsCategory
ViewAny:TallcmsMedia
View:TallcmsMedia

API Editor Role

Permissions for content management via API:

# Read permissions (from Reader)
ViewAny:CmsPage, View:CmsPage
ViewAny:CmsPost, View:CmsPost
ViewAny:CmsCategory, View:CmsCategory
ViewAny:TallcmsMedia, View:TallcmsMedia

# Write permissions
Create:CmsPage, Update:CmsPage
Create:CmsPost, Update:CmsPost
Create:CmsCategory, Update:CmsCategory
Create:TallcmsMedia, Update:TallcmsMedia

# Workflow permissions
ViewRevisions:CmsPage, ViewRevisions:CmsPost
SubmitForReview:CmsPage, SubmitForReview:CmsPost

API Publisher Role

Full content management including approval:

# All Editor permissions, plus:
Approve:CmsPage, Approve:CmsPost
Restore:CmsPage, Restore:CmsPost
RestoreRevision:CmsPage, RestoreRevision:CmsPost
Delete:CmsPage, Delete:CmsPost
Delete:CmsCategory
Delete:TallcmsMedia

API Admin Role

Full API access including force-delete and webhooks:

# All Publisher permissions, plus:
ForceDelete:CmsPage, ForceDelete:CmsPost
ViewAny:Webhook, View:Webhook
Create:Webhook, Update:Webhook, Delete:Webhook

Granting Permissions

Via Admin Panel

  1. Navigate to Admin > Shield > Roles
  2. Select or create a role
  3. Check the required permissions
  4. Click Save

Via Artisan

# Grant single permission
php artisan permission:grant-to-role editor "Approve:CmsPage"

# Grant multiple permissions
php artisan tinker
>>> $role = \Spatie\Permission\Models\Role::findByName('editor');
>>> $role->givePermissionTo(['Approve:CmsPage', 'Approve:CmsPost']);

Via Seeder

use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

$apiEditor = Role::findOrCreate('api_editor');

$apiEditor->givePermissionTo([
    'ViewAny:CmsPage', 'View:CmsPage', 'Create:CmsPage', 'Update:CmsPage',
    'ViewAny:CmsPost', 'View:CmsPost', 'Create:CmsPost', 'Update:CmsPost',
    'ViewRevisions:CmsPage', 'ViewRevisions:CmsPost',
    'SubmitForReview:CmsPage', 'SubmitForReview:CmsPost',
]);

Checking Permissions

In Code

// Check if user has permission
$user->can('Approve:CmsPage');

// Check via policy
$this->authorize('approve', $page);

// Get all user permissions
$user->getAllPermissions()->pluck('name');

Via Tinker

php artisan tinker
>>> $user = User::find(1);
>>> $user->can('ViewRevisions:CmsPage')
=> true
>>> $user->roles->pluck('name')
=> ["super_admin"]
>>> $user->getAllPermissions()->pluck('name')->filter(fn($p) => str_contains($p, 'CmsPage'))

Common Pitfalls

"This action is unauthorized" on workflow endpointsThe user is missing workflow permissions. Grant SubmitForReview:CmsPage, Approve:CmsPage, ViewRevisions:CmsPage as needed.

Token works for some endpoints but not othersCheck both token abilities AND Shield permissions. A pages:write token still needs Update:CmsPage permission.

New role can't access APIEnsure the role has at least ViewAny and View permissions for the resources it needs to access.

Super admin missing permissionsShield's super_admin role doesn't automatically have all permissions. You may need to grant new permissions explicitly after they're created.


Next Steps

Comments

No comments yet. Be the first to share your thoughts!

Choose Theme