Silex - 访问安全区域外的用户

时间:2016-04-14 10:08:56

标签: symfony security silex

我在Silex网站上设置了一个安全区域。我需要在用户连接时在标题中显示用户名,或者如果用户未连接则显示登录表单的链接。 但是当用户在未受保护的页面上(防火墙外)时,app.user未定义。

我尝试了this解决方案,但它不起作用。

这是我的安全配置:

$app->register(new Silex\Provider\SecurityServiceProvider(), array(
    'security.firewalls' => array(
        'account' => array(
            'pattern' => '^/account',
            'form' => array('login_path' => '/login', 'check_path' => '/account/login_check'),
            'users' => $app->share(function () use ($app) {
                return new UserProvider($app['db']);
            }),
        ),
        'unsecured' => array(
            'anonymous' => true,
        ),
    )
));

在这里我的标题显示用户名:

{% if app.user %}
    {{ app.user.username }}<br />
        <a href="{{ path('account') }}">Mon compte</a>
    {% else %}
        <a href="{{ path('login') }}">se connecter</a><br />
        <a href="{{ path('signup') }}">créer un compte</a>
{% endif %}

1 个答案:

答案 0 :(得分:1)

您可以将pattern修改为^/并允许匿名访问'anonymous' => true,从而将防火墙扩展到所有应用程序。应该安全的路径在security.access_rules

中指定
$app->register(new Silex\Provider\SecurityServiceProvider(), array(
    'security.firewalls' => array(
        'account' => array(
            'pattern' => '^/',
            'form' => array('login_path' => '/login', 'check_path' => '/login_check'),
            'users' => $app->share(function () use ($app) {
                return new UserProvider($app['db']);
            }),
            'anonymous' => true,
        )
    )
));

$app['security.access_rules'] = array(
    array('^/account', 'ROLE_USER', null)
);

用户方法getRoles()应返回角色ROLE_USER,这意味着用户可以访问security.access_rules中角色为ROLE_USER的所有路径。

class User implements \Symfony\Component\Security\Core\User\AdvancedUserInterface
{
...
    public function getRoles()
    {
        return array(new \Symfony\Component\Security\Core\Role\Role('ROLE_USER'));
    }
...
}