Skip to content
Snippets Groups Projects
Commit 996fc7d4 authored by Tobias Gross-Vogt's avatar Tobias Gross-Vogt
Browse files

extending the authorization expression language

parent 82628d88
No related branches found
No related tags found
No related merge requests found
Pipeline #208434 passed
<?php
declare(strict_types=1);
namespace Dbp\Relay\CoreBundle\Authorization\ExpressionLanguage\ExpressionFunctionProviders;
use Symfony\Component\ExpressionLanguage\ExpressionFunction;
use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
class FilterExpressionFunctionProvider implements ExpressionFunctionProviderInterface
{
/** @var ExpressionLanguage */
private $expressionLanguage;
public function __construct(ExpressionLanguage $expressionLanguage)
{
$this->expressionLanguage = $expressionLanguage;
}
public function getFunctions(): array
{
return [
new ExpressionFunction('filter',
function (string $iterableName, string $expression): string {
return sprintf('filter(%s, %s)', $iterableName, $expression);
},
function ($arguments, iterable $iterable, string $expression): array {
$filteredResult = [];
foreach ($iterable as $key => $value) {
if ($this->expressionLanguage->evaluate($expression, ['key' => $key, 'value' => $value])) {
$filteredResult[] = $value;
}
}
return $filteredResult;
}),
];
}
}
<?php
declare(strict_types=1);
namespace Dbp\Relay\CoreBundle\Authorization\ExpressionLanguage\ExpressionFunctionProviders;
use Symfony\Component\ExpressionLanguage\ExpressionFunction;
use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
class MapExpressionFunctionProvider implements ExpressionFunctionProviderInterface
{
/** @var ExpressionLanguage */
private $expressionLanguage;
public function __construct(ExpressionLanguage $expressionLanguage)
{
$this->expressionLanguage = $expressionLanguage;
}
public function getFunctions(): array
{
return [
new ExpressionFunction('map',
function (string $iterableName, string $expression): string {
return sprintf('map(%s, %s)', $iterableName, $expression);
},
function ($arguments, iterable $iterable, string $expression): array {
$transformedResult = [];
foreach ($iterable as $key => $value) {
$transformedResult[$key] = $this->expressionLanguage->evaluate($expression, ['key' => $key, 'value' => $value]);
}
return $transformedResult;
}),
];
}
}
<?php
declare(strict_types=1);
namespace Dbp\Relay\CoreBundle\Authorization\ExpressionLanguage\ExpressionFunctionProviders;
use Symfony\Component\ExpressionLanguage\ExpressionFunction;
use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
class PhpArrayExpressionFunctionProvider implements ExpressionFunctionProviderInterface
{
public function getFunctions(): array
{
return [
ExpressionFunction::fromPhp('count'),
ExpressionFunction::fromPhp('implode'),
ExpressionFunction::fromPhp('explode'),
];
}
}
<?php
declare(strict_types=1);
namespace Dbp\Relay\CoreBundle\Authorization\ExpressionLanguage\ExpressionFunctionProviders;
use Symfony\Component\ExpressionLanguage\ExpressionFunction;
use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
class PhpNumericExpressionFunctionProvider implements ExpressionFunctionProviderInterface
{
public function getFunctions(): array
{
return [
ExpressionFunction::fromPhp('ceil'),
ExpressionFunction::fromPhp('floor'),
ExpressionFunction::fromPhp('round'),
ExpressionFunction::fromPhp('max'),
ExpressionFunction::fromPhp('min'),
];
}
}
<?php
declare(strict_types=1);
namespace Dbp\Relay\CoreBundle\Authorization\ExpressionLanguage\ExpressionFunctionProviders;
use Symfony\Component\ExpressionLanguage\ExpressionFunction;
use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
class PhpStringExpressionFunctionProvider implements ExpressionFunctionProviderInterface
{
public function getFunctions(): array
{
return [
ExpressionFunction::fromPhp('str_starts_with'),
ExpressionFunction::fromPhp('str_ends_with'),
ExpressionFunction::fromPhp('substr'),
ExpressionFunction::fromPhp('strpos'),
ExpressionFunction::fromPhp('strlen'),
];
}
}
<?php
declare(strict_types=1);
namespace Dbp\Relay\CoreBundle\Authorization\ExpressionLanguage;
use Dbp\Relay\CoreBundle\Authorization\ExpressionLanguage\ExpressionFunctionProviders\FilterExpressionFunctionProvider;
use Dbp\Relay\CoreBundle\Authorization\ExpressionLanguage\ExpressionFunctionProviders\MapExpressionFunctionProvider;
use Dbp\Relay\CoreBundle\Authorization\ExpressionLanguage\ExpressionFunctionProviders\PhpArrayExpressionFunctionProvider;
use Dbp\Relay\CoreBundle\Authorization\ExpressionLanguage\ExpressionFunctionProviders\PhpNumericExpressionFunctionProvider;
use Dbp\Relay\CoreBundle\Authorization\ExpressionLanguage\ExpressionFunctionProviders\PhpStringExpressionFunctionProvider;
use Psr\Cache\CacheItemPoolInterface;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage as SymfonyExpressionLanguage;
class ExpressionLanguage extends SymfonyExpressionLanguage
{
public function __construct(CacheItemPoolInterface $cache = null, array $providers = [])
{
$providers = array_merge([
new FilterExpressionFunctionProvider($this),
new MapExpressionFunctionProvider($this),
new PhpArrayExpressionFunctionProvider(),
new PhpNumericExpressionFunctionProvider(),
new PhpStringExpressionFunctionProvider(),
], $providers);
parent::__construct($cache, $providers);
}
}
......@@ -4,8 +4,8 @@ declare(strict_types=1);
namespace Dbp\Relay\CoreBundle\Authorization;
use Dbp\Relay\CoreBundle\Authorization\ExpressionLanguage\ExpressionLanguage;
use Dbp\Relay\CoreBundle\Helpers\Tools;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
class UserAuthorizationChecker
{
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment