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

Pau*_*aul 1 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,
        ),
    ),
));
Run Code Online (Sandbox Code Playgroud)

正如你所看到的/admin路径被固定,我可以使用$app['security']->getToken()->getUser();来获取被认证的实际用户,并显示类似登入身分$的用户名,但如果我这样做对/login/航线的用户永远是anon.即使我认证.

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

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

Pau*_*aul 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'),
    ),
));
Run Code Online (Sandbox Code Playgroud)