<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
monkeyscloud / monkeyslegion-permissions example snippets
use MonkeysLegion\Permissions\Attributes\RequiresRole;
use MonkeysLegion\Permissions\Attributes\RequiresPermission;
use MonkeysLegion\Permissions\Attributes\Authorize;
#[RequiresRole('admin')]
class AdminController
{
#[RequiresPermission('users.create')]
public function createUser(): Response
{
// Only accessible to admins with users.create permission
}
#[Authorize('update-user', subject: 'user')]
public function updateUser(int $id): Response
{
// Delegates to a policy: UserPolicy::update($currentUser, $user)
}
}
use MonkeysLegion\Permissions\Policy\Policy;
class PostPolicy extends Policy
{
public function update(object $user, object $post): bool
{
return $user->id === $post->author_id;
}
public function delete(object $user, object $post): bool
{
return $user->role === 'admin';
}
// Optional: runs before any check
public function before(object $user, string $ability): ?bool
{
// Super-admins can do anything
if ($user->role === 'super-admin') {
return true;
}
return null; // fall through to specific check
}
}
use MonkeysLegion\Permissions\Rule\Rule;
use MonkeysLegion\Permissions\Rule\Predicate;
use MonkeysLegion\Permissions\Rule\PredicateType;
use MonkeysLegion\Permissions\Rule\RuleEngine;
// Build rules with predicates
$rule = new Rule(
name: 'business-hours-only',
key: 'business_hours',
predicates: [
new Predicate(PredicateType::Custom, fn() => date('H') >= 9 && date('H') < 17),
],
priority: 10,
);
$engine = new RuleEngine();
$engine->addRule($rule);
$result = $engine->evaluate($context);
// RuleResult: allowed, denied, or abstained
use MonkeysLegion\Permissions\Workflow\RequestManager;
$manager = $container->get(RequestManager::class);
// User requests a permission
$request = $manager->request(
userId: 'user-42',
targetKey: 'reports.export',
reason: 'Need to export Q4 reports for client presentation',
);
// Admin reviews
$manager->approve($request, reviewedBy: 'admin-1', note: 'Approved for Q4');
// or
$manager->deny($request, reviewedBy: 'admin-1', note: 'Use dashboard instead');
use MonkeysLegion\Permissions\Apex\ApexGateRegistrar;
$registrar = $container->get(ApexGateRegistrar::class);
// Register AI-powered policy
$registrar->register(
gateName: 'content-appropriate',
prompt: 'Is the following content appropriate for a professional workplace?',
confidenceThreshold: 0.8,
);
// Now use it like any other gate
$authorizer->authorize($user, 'content-appropriate', ['content' => $postBody]);
$dispatcher->listen(AuthorizationDenied::class, function (AuthorizationDenied $event) {
$logger->warning("Access denied: user {$event->userId} → {$event->ability}");
});
// In your middleware pipeline
$pipeline->pipe(AuthorizationMiddleware::class);
// The middleware:
// 1. Reads #[RequiresRole], #[RequiresPermission], #[Authorize], #[Gate] from the route
// 2. Checks permissions via Authorizer
// 3. Returns 403 on denial
// 4. Dispatches audit events
use MonkeysLegion\Permissions\Cache\CacheLayer;
$cache = new CacheLayer($cacheStore, prefix: 'perm:', ttl: 3600);
// Permissions are cached transparently
$hasPermission = $cache->remember("user:42:posts.edit", function () use ($store) {
return $store->hasPermission('user-42', 'posts.edit');
});
// Invalidate on changes
$cache->forget("user:42:*");
bash
# Full install: config + entities + migration
php ml permissions:install
# Or just copy entity stubs
php ml permissions:entities
php ml permissions:entities --force # overwrite existing
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.