summaryrefslogtreecommitdiffstats
path: root/Core
diff options
context:
space:
mode:
authorFabien Potencier <fabien.potencier@gmail.com>2014-09-28 13:22:15 +0200
committerFabien Potencier <fabien.potencier@gmail.com>2014-09-28 13:22:15 +0200
commitbeb901f75e8016b254fb64ebf477e92a7b001122 (patch)
treee2823fe123140048e18914c3294045cd7dee05d7 /Core
parent1e5a6bb4b4393102d52b294a9e426a2bafa877b4 (diff)
parent8f706dec8d6c094cd92ef275588e4bc248d577a7 (diff)
downloadsymfony-security-beb901f75e8016b254fb64ebf477e92a7b001122.zip
symfony-security-beb901f75e8016b254fb64ebf477e92a7b001122.tar.gz
symfony-security-beb901f75e8016b254fb64ebf477e92a7b001122.tar.bz2
feature #12006 Expression language extensibility (fabpot)
This PR was merged into the 2.6-dev branch. Discussion ---------- Expression language extensibility | Q | A | ------------- | --- | Bug fix? | no | New feature? | yes | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | #10512 | License | MIT | Doc PR | not yet The way we can add functions to an ExpressionLanguage instance is by using inheritance. #10512 tries to make the expression language in the routing flexible but using inheritance won't work when several bundles want to add functions. So, this PR takes another approach to solve the problem globally. Todo: * [x] add some more tests * [ ] add some docs Commits ------- 7c24188 [FrameworkBundle] added a compiler pass for expression language providers 4195a91 [Routing] added support for custom expression language functions 1a39046 [Security] added support for custom expression language functions 79bcd52b [DependencyInjection] added support for custom expression language functions 184742c [ExpressionLanguage] added ExpressionFunction and ExpressionFunctionProviderInterface
Diffstat (limited to 'Core')
-rw-r--r--Core/Authorization/ExpressionLanguage.php38
-rw-r--r--Core/Authorization/ExpressionLanguageProvider.php58
2 files changed, 65 insertions, 31 deletions
diff --git a/Core/Authorization/ExpressionLanguage.php b/Core/Authorization/ExpressionLanguage.php
index f9012b7..ac6a036 100644
--- a/Core/Authorization/ExpressionLanguage.php
+++ b/Core/Authorization/ExpressionLanguage.php
@@ -12,46 +12,22 @@
namespace Symfony\Component\Security\Core\Authorization;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage as BaseExpressionLanguage;
+use Symfony\Component\ExpressionLanguage\ParserCache\ParserCacheInterface;
/**
* Adds some function to the default ExpressionLanguage.
*
* @author Fabien Potencier <fabien@symfony.com>
+ *
+ * @see ExpressionLanguageProvider
*/
class ExpressionLanguage extends BaseExpressionLanguage
{
- protected function registerFunctions()
+ public function __construct(ParserCacheInterface $cache = null, array $providers = array())
{
- parent::registerFunctions();
-
- $this->register('is_anonymous', function () {
- return '$trust_resolver->isAnonymous($token)';
- }, function (array $variables) {
- return $variables['trust_resolver']->isAnonymous($variables['token']);
- });
-
- $this->register('is_authenticated', function () {
- return '$token && !$trust_resolver->isAnonymous($token)';
- }, function (array $variables) {
- return $variables['token'] && !$variables['trust_resolver']->isAnonymous($variables['token']);
- });
-
- $this->register('is_fully_authenticated', function () {
- return '$trust_resolver->isFullFledged($token)';
- }, function (array $variables) {
- return $variables['trust_resolver']->isFullFledged($variables['token']);
- });
-
- $this->register('is_remember_me', function () {
- return '$trust_resolver->isRememberMe($token)';
- }, function (array $variables) {
- return $variables['trust_resolver']->isRememberMe($variables['token']);
- });
+ // prepend the default provider to let users overide it easily
+ array_unshift($providers, new ExpressionLanguageProvider());
- $this->register('has_role', function ($role) {
- return sprintf('in_array(%s, $roles)', $role);
- }, function (array $variables, $role) {
- return in_array($role, $variables['roles']);
- });
+ parent::__construct($cache, $providers);
}
}
diff --git a/Core/Authorization/ExpressionLanguageProvider.php b/Core/Authorization/ExpressionLanguageProvider.php
new file mode 100644
index 0000000..9293ba7
--- /dev/null
+++ b/Core/Authorization/ExpressionLanguageProvider.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Security\Core\Authorization;
+
+use Symfony\Component\ExpressionLanguage\ExpressionFunction;
+use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
+
+/**
+ * Define some ExpressionLanguage functions.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class ExpressionLanguageProvider implements ExpressionFunctionProviderInterface
+{
+ public function getFunctions()
+ {
+ return array(
+ new ExpressionFunction('is_anonymous', function () {
+ return '$trust_resolver->isAnonymous($token)';
+ }, function (array $variables) {
+ return $variables['trust_resolver']->isAnonymous($variables['token']);
+ }),
+
+ new ExpressionFunction('is_authenticated', function () {
+ return '$token && !$trust_resolver->isAnonymous($token)';
+ }, function (array $variables) {
+ return $variables['token'] && !$variables['trust_resolver']->isAnonymous($variables['token']);
+ }),
+
+ new ExpressionFunction('is_fully_authenticated', function () {
+ return '$trust_resolver->isFullFledged($token)';
+ }, function (array $variables) {
+ return $variables['trust_resolver']->isFullFledged($variables['token']);
+ }),
+
+ new ExpressionFunction('is_remember_me', function () {
+ return '$trust_resolver->isRememberMe($token)';
+ }, function (array $variables) {
+ return $variables['trust_resolver']->isRememberMe($variables['token']);
+ }),
+
+ new ExpressionFunction('has_role', function ($role) {
+ return sprintf('in_array(%s, $roles)', $role);
+ }, function (array $variables, $role) {
+ return in_array($role, $variables['roles']);
+ }),
+ );
+ }
+}