0

私は現在、Silexを使用して Web アプリケーションを構築しており、SecurityServiceProvider.

ブートストラップ コードに次のスニペットを追加しました。

$app->register(new Silex\Provider\SecurityServiceProvider(), array(
    'security.firewalls'    => array(
        'login' => array(
            'pattern' => '^/login$',
            'security' => false,
        ),
        'secured' => array(
            'pattern'   => '^.*$',
            'anonymous' => true,
            'form' => array('login_path' => '/login', 'check_path' => '/login/check'),
            'logout' => array('logout_path', '/logout'),
            'users' => $app['custom.user_provider'],
            'switch_user' => array('parameter' => '_switch_user', 'role' => 'ROLE_IMPERSONATE'),
        ),
    ),
    'security.encoder.digest' => $app->share(function ($app) {
        return new MySQLPasswordEncoder(false);
    }),
));
$app['security.role_hierarchy'] = array(
    'ROLE_ADMIN'    => array('ROLE_STAFF', 'ROLE_BAN_MGR', 'ROLE_IMPERSONATE'),
    'ROLE_STAFF'    => array('ROLE_USER'),
);
$app['security.access_rules'] = array(
    array('^/admin/bans/.*$', 'ROLE_BAN_MGR'),
    array('^/admin/.*$',      'ROLE_STAFF'),
    array('^/account/.*$',    'ROLE_USER'),
    array('^.*$',         ''),
);

is_granted(...)任意のページでセキュリティ コンテキスト (つまり、テンプレート内) を使用できるようにしたいので、 を使用します'pattern' => '^.*$', 'anonymous' => true。セキュリティで保護された領域の外にいる
という要件を満たすために、ファイアウォールを追加しました。login_pathlogin

ここでの問題は、/loginページでセキュリティ コンテキストを使用できないためis_granted(...)、例外がスローされることです。

AuthenticationCredentialsNotFoundException: セキュリティ コンテキストに認証トークンが含まれていません。考えられる理由の 1 つは、この URL にファイアウォールが構成されていないことです。

ファイアウォールに追加しようとし'security' => true, 'anonymous' => trueましたloginが、これにより無限のリダイレクトが発生します (/login安全な領域内にあるため)。

質問:ログイン ページ (定義上、保護されていない可能性があります) でセキュリティ コンテキストを使用できるようにするにはどうすればよいですか?

4

1 に答える 1