6

Silex を使用していますが、テンプレートで is_granted 関数を使用できません。これが機能しない理由について、ドキュメントには何も見つかりません。ヒントはありますか?

$app->register(new Silex\Provider\SecurityServiceProvider());

$app->register(new Silex\Provider\TwigServiceProvider(), array(
    'twig.path' => __DIR__.'/../templates',
    'twig.options' => array('cache' => __DIR__.'/../cache'),
));

$app['debug'] = true;

$app['security.firewalls'] = array(
    'login' => array(
                'pattern' => '^/login$',
        ),
        'secured' => array(
                'pattern' => '^.*$',
                'form' => array('login_path' => '/login', 'check_path' => '/login_check'),
                'users' => array(
                        'admin' => array('ROLE_ADMIN', '5FZ2Z8QIkA7UTZ4BYkoC+GsReLf569mSKDsfods6LYQ8t+a8EW9oaircfMpmaLbPBh4FOBiiFyLfuZmTSUwzZg=='),
                ),
        ),
);

$app->get('/', function() use ($app) {
    return $app['twig']->render('index.html.twig');
});

$app->get('/login', function(Request $request) use ($app) {
    return $app['twig']->render('login.html.twig', array(
            'error'                 => $app['security.last_error']($request),
            //'last_username' => $app['session']->get('_security.last_username'),
    ));
});
4

5 に答える 5

11

どうやら、symfony/bridge コンポーネントも追加する必要があったようです:

これを composer.json に追加して更新します。

"symfony/twig-bridge": "2.1.*",

そしてねえ...それは期待どおりに動作します.

于 2012-10-24T20:27:46.733 に答える
4

この回避策を使用する必要がありました(欠点があるかどうかはまだわかりません)

$function = new Twig_SimpleFunction('is_granted', function($role) use ($app){
    return $app['security']->isGranted($role);
});
$app['twig']->addFunction($function);
于 2013-01-31T21:48:01.820 に答える
0

問題は、クラスを登録する順序が原因である可能性が最も高いです。順序は SecurityServiceProvider で、アプリケーションを起動してから TwigServiceProvider を登録する必要があります。TwigServiceProvider は $app['security'] をチェックして、Twig SecurityExtension をセットアップします。だから順番が大事

// Security service
$app["security.firewalls"] = array();
$app->register(new Silex\Provider\SecurityServiceProvider());

// Boot your application to call SecurityServiceProvider()->boot()
$app->boot();

// Twig service
$app->register(new Silex\Provider\TwigServiceProvider(), array(
  'twig.path' => sprintf("%s/../views", __DIR__),
));
于 2015-05-22T04:03:09.907 に答える
0

Symfony 2.6 コンポーネントを使用する場合、次のようにsecurityではなくsecurity.authorization_checkerになります。

$function = new Twig_SimpleFunction('is_granted', function($role,$object = null) use ($app){
    return $app['security.authorization_checker']->isGranted($role,$object);
});
$app['twig']->addFunction($function);
于 2017-10-30T20:19:08.200 に答える