identity !== null) { throw new \LogicException('The execution identity has already been initialized.'); } $this->identity = $identity; } public function clear(): void { $this->identity = null; } public function present(): bool { return $this->identity !== null; } public function identity(): ?User { return $this->identity; } public function identifier(): ?string { return $this->identity?->getId(); } public function requireIdentifier(): string { return $this->identifier() ?? throw new \LogicException('This operation requires an identity context.'); } public function label(): ?string { return $this->identity?->getLabel(); } public function mailAddress(): ?string { return $this->identity?->getIdentity(); } public function nameFirst(): ?string { return null; } public function nameLast(): ?string { return null; } public function permissions(): array { return $this->identity?->getPermissions() ?? []; } public function roles(): array { return $this->identity?->getRoles() ?? []; } public function hasPermission(string $permission): bool { $permissions = $this->permissions(); if (in_array($permission, $permissions, true) || in_array('*', $permissions, true)) { return true; } foreach ($permissions as $userPermission) { if (str_ends_with($userPermission, '.*')) { $prefix = substr($userPermission, 0, -2); if (str_starts_with($permission, $prefix . '.')) { return true; } } } return false; } public function hasRole(string $role): bool { return in_array($role, $this->roles(), true); } }