我目前正在使用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:安全上下文不包含身份验证令牌。一个可能的原因可能是没有为此 URL 配置防火墙。
我尝试添加'security' => true, 'anonymous' => true
到login
防火墙,但这会导致无限重定向(因为/login
在安全区域内)。
问题:如何使登录页面上的安全上下文可用(根据定义,它可能不受保护)?