Silex / Symfony上的“SecurityContext中未找到令牌”

时间:2012-12-18 15:57:27

标签: php symfony silex

我使用登录机制构建了一个Silex项目。

我不是Symfony专家,我严格遵循此处的指南进行身份验证过程:http://silex.sensiolabs.org/doc/providers/security.html

...它在我的开发环境中运行良好

但是,当我在生产服务器上推送项目时,每次尝试登录我的网络应用程序时都会出现以下错误

[2012-12-18 16:35:33] CRITICAL: Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException:
A Token was not found in the SecurityContext. (uncaught exception) at
/my/app/path/vendor/symfony/security/Symfony/Component/Security/Http/Firewall/AccessListener.php line 53 [] []

表示AccessListener.php中的以下代码

$this->context->getToken());

投掷预期

鉴于相同的代码在我的开发环境中运行得非常好,我认为它与我的生产服务器配置有关。

我发现这个帖子http://groups.google.com/forum/#!msg/symfony-devs/jKphNy_0Q2Y/vYfkAuyjSHEJ建议将以下行添加到我的项目.htaccess

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

没有结果。我仍然得到“在SecurityContext中找不到A令牌”的例外。

有人有想法吗?

修改 $app['security.firewalls']的内容如下

$app->register(new Silex\Provider\SecurityServiceProvider(), array(
'security.firewalls' => array(
'login' => array(
  'pattern' => '^/login$'
),
'admin' => array(
  'pattern' => '^/',
  'form'    => array('login_path' => '/login', 'check_path' => '/admin/login_check'),
  'logout'  => array('logout_path' => '/admin/logout'), // url to call for logging out
  'users' => array(
  'admin' => array('ROLE_ADMIN', 'SOMEPASSWORD'),
  ),
)
)
));

2 个答案:

答案 0 :(得分:1)

它似乎与HTTP Basic Auth无关,因为您不在任何防火墙中使用它。您使用的是具有form入口点的防火墙,然后使用会话来存储安全令牌。

我建议你看看与你的开发环境相比,如何在prod服务器上管理会话(和cookie)。

答案 1 :(得分:0)

这很可能是因为它在本地计算机上工作但在生产环境中不起作用的原因是Apache支持.htaccess,而nginx does not bother wasting I/O and CPU time parsing this files

如果您发布.htaccess,我将向您展示如何将其转换为高性能的nginx可读配置。

修改

Silex甚至有nginx的配置示例

http://silex.sensiolabs.org/doc/web_servers.html