2 votes

Comment activer correctement l'extension twig's sandbox dans Symfony2 ?

Dans Symfony2, le module Twig est désactivé par défaut. L'un d'entre eux est l'extension debug, qui ajoute {% debug %} (utile dans un environnement de développement).

Pour l'activer, rien de bien difficile, vous ajoutez ce service à votre configuration :

  debug.twig.extension:
    class: Twig_Extensions_Extension_Debug
    tags:
      - { name: 'twig.extension' }

Mais comment activer le {% sandbox %} tag ?

Mon problème est que le constructeur de l'extension prend en compte les politiques de sécurité :

public function __construct(Twig_Sandbox_SecurityPolicyInterface $policy, $sandboxed = false)
{
    $this->policy            = $policy;
    $this->sandboxedGlobally = $sandboxed;
}

En lisant le documentation twig J'ai vu le moyen de le faire nativement (sans Symfony2) :

$tags = array('if');
$filters = array('upper');
$methods = array(
    'Article' => array('getTitle', 'getBody'),
);
$properties = array(
    'Article' => array('title', 'body'),
);
$functions = array('range');
$policy = new Twig_Sandbox_SecurityPolicy($tags, $filters, $methods, $properties, $functions);
$sandbox = new Twig_Extension_Sandbox($policy);
$twig->addExtension($sandbox);

Je peux faire quelque chose comme cela à l'intérieur d'un service juste avant d'utiliser le bac à sable, mais ce n'est pas aussi clair que l'injection de dépendance à laquelle nous sommes habitués.

Existe-t-il une meilleure façon d'activer l'extension twig's sandbox dans Symfony2 ?

7voto

Ramon Kleiss Points 1584

Pourquoi ne pas créer un service privé de la politique de sécurité :

parameters:
    twig.sandbox.tags:
        - if
    twig.sandbox.filters:
        - upper
    twig.sandbox.methods:
        Article: [getTitle, getBody]
    twig.sandbox.properties:
        Article: [title, body]
    twig.sandbox.functions:
        - range

twig.sandbox.policy:
    class: Twig_Sandbox_SecurityPolicy
    arguments:
        - %twig.sandbox.tags%
        - %twig.sandbox.filters%
        - %twig.sandbox.methods%
        - %twig.sandbox.properties%
        - %twig.sandbox.functions%
    public: false

Vous pouvez ensuite injecter ce service dans le twig.sandbox.extension service :

twig.sandbox.extension:
    class: Twig_Extension_Sandbox
    arguments:
        - @twig.sandbox.policy
    tags:
        - { name: twig.extension }

Fait. Marquer le twig.sandbox.policy private garantit qu'il ne sera pas accessible via le conteneur (il peut toujours être injecté dans d'autres services, mais je pense que ce n'est pas un problème).

Avertissement : je n'ai pas testé cette méthode et il est probable qu'elle doive être modifiée avant de fonctionner, alors ne faites pas de copier-coller !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X