2010-02-08 46 views
1

在我们的网站中,我们有一个登录按钮,每当有人登录按钮变成“注销”,用户名称显示在旁边。我们的服务器设置使用了Varnish,所以我们设计了一种方法,让一些javascript执行POST操作,并检查用户是否已通过身份验证。应用程序外的Symfony会话?

为了避免服务器开销,我认为只需创建位于网站根/checkuser.php中的脚本并尝试在那里读取会话变量(我们让Varnish不缓存该文件)就会很简单。这样我们可以绕过所有需要加载的类来检查这个用户会话。

不过,长话短说,checkuser.php中的会话总是空的。如果我使用$ user-> getAttribute检查它是否有效。怎么办?

回答

3

好的,我明白了。 Symfony以自己的名义使用它的会话。如果你想使用会话您的应用程序外(或框架),你可以得到会话就像这样:

session_name('symfony'); 
session_start(); 
var_dump($_SESSION); 

当然条件是你没有在factories.yml文件

THX重命名会话名称prodigitalson的帮助。

0

你使用了什么会话映射?我相信,Symfony的使用空间中,因此没有什么是永远在会话的顶层...例如,你可能有:

$_SESSION = Array(
    symfony = Array(
    sf_user => $userSessionValues 
    sf_debug => $debugValues 
) 
) 

我不记得实际的结构,但这样做在$ _SESSION一的print_r或后续代码var_dump(从可以肯定的是,他们应该给你这片土地以便说话。

+0

var_dump($ _SESSION); 给出: null 但是从sf中我得到了预期的结果...... – Marc 2010-02-08 14:59:20

+0

有意思......并且你从独立脚本中调用了'session_start()'和所有爵士乐,对吗? – prodigitalson 2010-02-08 15:08:06

+0

yes ... session_start()是第1行,var_dump($ _ SESSION)是第2行。 我正在尝试像symfony那样获取sessionid来挂钩那个会话......但目前还没有... :( – Marc 2010-02-08 15:15:20

1

一个更复杂的(我不会说好,因为它只有更好,如果你需要额外的功能)的方式来做到这一点是做这样的事情:

require_once($_SERVER['DOCUMENT_ROOT'].'/../config/ProjectConfiguration.class.php'); 

$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'prod', false); 
$context = sfContext::createInstance($configuration); 

if ($context->getUser()->isSuperAdmin()) { 
    "do something"; 
} 

if ($context->getUser()->hasCredential('something')) { 
    "do something else" 
} 

这种方式的优点是如您所见,您可以使用symfony中更复杂的方法,而不仅仅是查看原始会话数据。

(从http://benlumley.co.uk/2009/05/24/hook-into-symfony-authentication-from-external-script-fckeditor/解除)