1

我使用 PHP 和 Silex 构建了一个 Web 应用程序,并通过SecurityServiceProvider以下方式实现了基本身份验证:

$app->register(new Silex\Provider\SecurityServiceProvider(), array(
    'security.firewalls' => array(
        'private' => array(
            'remember_me' => array(
                'key' => $config['secret_key'],
                'lifetime' => $config['remember_me_duration'],
            ),
            'pattern' => '^/admin',
            'form' => array('login_path' => '/login', 'check_path' => '/admin/login_check'),
            'logout' => array('logout_path' => '/admin/logout'),
            'users' => $app->share(function () use ($app) {
                // ...
            }),
        ),
        'public' => array(
            'pattern' => '^/$',
            'anonymous' => true,
        ),
        'login' => array(
            'pattern' => '^/login$',
            'anonymous' => true,
        ),
    ),
));

如您所见,/admin路径是安全的,我可以$app['security']->getToken()->getUser();在那里获取经过身份验证的实际用户并显示类似Logged in as $username之类的内容,但如果我在/loginor/路由上执行此操作,anon.即使我是认证。

我怎样才能获得经过身份验证的用户,如果有的话,否则anon.字符串,在/and/login路由上,以便显示如下消息:Logged in as $username

我还尝试使用is_granted('IS_AUTHENTICATED_FULLY'树枝模板中的函数来检查用户是否经过身份验证,但是打开/login并且/它返回 false(即使我经过身份验证),因为匿名用户优先于经过身份验证的用户,所以这里没有成功。

4

3 回答 3

6

为了帮助其他人,我解决了如下所述的问题。Silex 不使用access_control, 而是access_rules(该死的)。

正如Pazi (+1ed) 所建议的那样,我将所有内容组合在一个防火墙下并使用access_rules

$app->register(new Silex\Provider\SecurityServiceProvider(), array(
    'security.firewalls' => array(
        'main' => array(
            'remember_me' => array(
                'key' => $config['secret_key'],
                'lifetime' => $config['remember_me_duration'],
            ),
            'pattern' => '^/',
            'anonymous' => true,
            'form' => array(
                'login_path' => '/login',
                'check_path' => '/admin/login_check',
            ),
            'logout' => array('logout_path' => '/admin/logout'),
            'users' => $app->share(function () use ($app) {
                // ...
            }),
        ),
    ),
    'security.access_rules' => array(array('^/admin/files', 'ROLE_ADMIN'),
    ),
));
于 2013-08-13T14:52:35.083 回答
1

一切都必须在同一个防火墙下,并且您必须使用访问控制。

于 2013-08-13T10:11:36.647 回答
0

@Paul我更喜欢添加评论,但我还不能这样做,所以作为答案:

好像拿出来

'pattern' => '^/admin'

来自防火墙模式的字符串,您已经打开了对 /admin/login_check 的匿名访问,这是不对的。

我的建议是收回并删除

'anonymous' => 'true'

从防火墙线。应该工作相同,但会更安全。

于 2014-01-27T01:31:11.673 回答