我目前正在用建立一個web應用程序Silex並剛剛開始實施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:安全上下文不包含身份驗證令牌。一個可能的原因可能是沒有爲此URL配置防火牆。
我嘗試添加'security' => true, 'anonymous' => true
到login
防火牆,但是這會導致inifinite重定向(因爲/login
是一個安全的區域內)。
問題:如何使登錄頁面上的安全上下文可用(根據定義,它可能不安全)?
將anonymous => true添加到登錄路由應該足以滿足您的需求。 – gunnx 2013-05-08 10:22:10
@gunnx我對''security'=> false'和''security'=> true'都試過,但它沒有奏效。 _mpm_的回答很好。 – Lukas 2013-05-08 16:08:50