私は現在、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_path
login
ここでの問題は、/login
ページでセキュリティ コンテキストを使用できないためis_granted(...)
、例外がスローされることです。
AuthenticationCredentialsNotFoundException: セキュリティ コンテキストに認証トークンが含まれていません。考えられる理由の 1 つは、この URL にファイアウォールが構成されていないことです。
ファイアウォールに追加しようとし'security' => true, 'anonymous' => true
ましたlogin
が、これにより無限のリダイレクトが発生します (/login
安全な領域内にあるため)。
質問:ログイン ページ (定義上、保護されていない可能性があります) でセキュリティ コンテキストを使用できるようにするにはどうすればよいですか?