在非安全(匿名)路由上显示经过身份验证的用户

时间:2013-08-13 10:04:55

标签: php authentication symfony twig silex

我使用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();来获取经过身份验证的实际用户,并显示以$ username登录的内容 ,但如果我在/login/路由上执行此操作,则即使我已通过身份验证,用户也始终为anon.

我如何获得经过身份验证的用户(如果有anon./路由上的/login字符串,以便显示如下消息:以$ username 登录?

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

3 个答案:

答案 0 :(得分: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'),
    ),
));

答案 1 :(得分:1)

所有内容必须位于同一防火墙下,您必须使用访问控制。

答案 2 :(得分:0)

@保罗 我更愿意添加评论,但我还不能这样做,所以作为答案而不是:

看起来好像取出

'pattern' => '^/admin'

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

我的建议是将其取回并删除

'anonymous' => 'true'

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