Skip to main content
Version: 2.0

Authorization Service

Usage

The Authorization service can be retrieved from the service manager using the name Lmc\Rbac\Service\AuthorizationServiceInterface and injected into your code:

<?php
/** @var \Psr\Container\ContainerInterface $container */
$authorizationService = $container->get(Lmc\Rbac\Service\AuthorizationServiceInterface::class);

Reference

Lmc\Rbac\Service\AuthorizationServiceInterface defines the following methods:

isGranted(?IdentityInterface $identity, string $permission, $context = null): bool

Checks that the identity has is granted the permission for the (optional) context.

ParameterDescription
$identityThe identity whose roles to checks.
If $identity is null, then the guest is used.
The guest role is definable via configuration and defaults to 'guest'.
$permissionThe permission to check against
$contextA context that will be passed to dynamic assertions that are defined for the permission

setAssertions(array $assertions, bool $merge = false): void

Allows to define dynamic assertions at run-time.

ParameterDescription
$assertionsAn array of assertions to merge or to replace
$mergeif true the content of $assertions will be merged with existing assertions.

setAssertion(string $permission, AssertionInterface|callable|string $assertion): void

Allows to define a dynamic assertion at run-time.

ParameterDescription
$permissionPermission name
$assertionThe assertion to set for $permission

hasAssertion(string $permission): bool

Checks if the authorization has a dynamic assertion for a given permission.

ParameterDescription
$permissionPermission name

getAssertions(): array

Returns all the dynamic assertions defined.

getAssertion(string $permission): AssertionInterface|callable|string|null

Returns the dynamic assertion for the give permission

ParameterDescription
$permissionPermission permission name

More on dynamic assertions can be found in the Assertions section.

More on the guest role can be found in the Configuration section.

Injecting the Authorization Service

There are a few methods to inject the Authorization Service into your service.

Using a factory

You can inject the AuthorizationService into your own objects using a factory. The Authorization Service can be retrieved from the container using 'Lmc\Rbac\Service\AuthorizationServiceInterface'.

Here is a classic example for injecting the Authorization Service into your own service

in your app's Module

use Lmc\Rbac\Service\AuthorizationServiceInterface;
class Module
{
public function getConfig()
{
return [
'service_manager' => [
'factories' => [
'MyService' => function($sm) {
$authService = $sm->get('AuthorizationServiceInterface');
return new MyService($authService);
}
],
],
];
}
}

Using traits

For convenience, LmcRbac provides a AuthorizationServiceAwareTrait that adds the $authorizationService property and setter/getter methods.

Using delegators

LmcRbac ships with a Lmc\Rbac\Service\AuthorizationServiceDelegatorFactory delegator factory to automatically inject the authorization service into your classes.

Your class must implement the Lmc\Rbac\Service\AuthorizationServiceAwareInterface and use the above trait, as shown below:

namespace MyModule;

use Lmc\Rbac\Service\AuthorizationServiceAwareInterface;
use Lmc\Rbac\Service\AuthorizationServiceAwareTrait;

class MyClass implements AuthorizationServiceAwareInterface
{
use AuthorizationServiceAwareTrait;

public function doSomethingThatRequiresAuth()
{
if (! $this->getAuthorizationService()->isGranted($identity, 'deletePost')) {
throw new \Exception('You are not allowed !');
}
return true;
}
}

And add your class to the right delegator:

namespace MyModule;
use Lmc\Rbac\Service\AuthorizationServiceDelegatorFactory;
class Module
{
// ...

public function getConfig()
{
return [
'service_manager' => [
'factories' => [
MyClass::class => InvokableFactory::class,
],
'delegators' => [
MyClass::class => [
AuthorizationServiceDelegatorFactory::class,
],
],
],
];
}
}