如何在登录页面上提供安全上下文?

时间:2013-05-07 18:41:33

标签: php security symfony silex

我目前正在使用 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位于安全区域内)。

问题:如何在登录页面上提供安全上下文(根据定义,可能无法保证安全)?

1 个答案:

答案 0 :(得分:2)

删除第一个防火墙

   'login' => array(
            'pattern' => '^/login$',
            'security' => false,
        ),

,这是不必要的

并将上次访问规则更改为此

array('^/login','IS_AUTHENTICATED_ANONYMOUSLY'),

这里有更多细节,当您对silex有疑问时,symfony doc就是您应该花费大部分时间的地方:

http://symfony.com/doc/current/book/security.html