ModX革命中的前端Ajax

时间:2012-05-01 09:08:39

标签: ajax modx-revolution

在ModX Revolution中实现前端Ajax功能的正确方法是什么?我喜欢连接器和处理器的想法,但由于某种原因它们仅用于后端使用 - modConnectorResponse检查用户是否登录并返回“拒绝访问”,如果不是的话。

将一个片段插入资源并通过资源URL调用它似乎是一次性解决方案,但这对我来说并不合适。

那么如何为前端获得类似连接器的安全功能呢?

3 个答案:

答案 0 :(得分:2)

因此,作为boundaryfunctions said,这是不可能的,并且ModX开发人员建议使用包含单个代码段的资源。但对于那些尽管开发人员希望寻找类似连接器功能的人,可能会有一个解决方案 - 猜测谁 - Gallery extra中的ModX核心开发人员分裂。在connector.php之前,在handleRequest()来电之前,会有一个代码伪造授权:

if ($_REQUEST['action'] == 'web/phpthumb') {
    $version = $modx->getVersionData();
    if (version_compare($version['full_version'],'2.1.1-pl') >= 0) {
        if ($modx->user->hasSessionContext($modx->context->get('key'))) {
            $_SERVER['HTTP_MODAUTH'] = $_SESSION["modx.{$modx->context->get('key')}.user.token"];
        } else {
            $_SESSION["modx.{$modx->context->get('key')}.user.token"] = 0;
            $_SERVER['HTTP_MODAUTH'] = 0;
        }
    } else {
        $_SERVER['HTTP_MODAUTH'] = $modx->site_id;
    }
    $_REQUEST['HTTP_MODAUTH'] = $_SERVER['HTTP_MODAUTH'];
}

适合我。只需要用我自己的行为替换第一个if条件。

更新:我忘了提及您需要在AJAX请求中传递&ctx=web参数,因为连接器的默认上下文是“mgr”而匿名用户不会传递策略检查(除非您为匿名用户设置了对“mgr”上下文的访问权限。)

此外我在这里发布的Gallery的代码似乎也检查了一些会话内容,这对我来说不适用于匿名前端用户(并且仅在我登录到后端时才有效),所以我用下一个替换它:

if (in_array($_REQUEST['action'], array('loadMap', 'loadMarkers'))){
    $_SESSION["modx.{$modx->context->get('key')}.user.token"] = 1;
    $_SERVER['HTTP_MODAUTH'] = $_REQUEST['HTTP_MODAUTH'] = 1;
}

我不知道此代码是否100%安全,但是当匿名用户调用它时,他似乎没有登录到Manager,并且当admin登录并从后端调用该操作时,他没有被武力注销。这看起来对我来说足够安全。

这个解决方案仍然是可移植的(即可以嵌入到可分发的Extra中),但是对于严肃的项目,应该更加认真地研究安全性。

答案 1 :(得分:1)

据我所知,目前在modX中这是不可能的。它已经是discussed on the modx forumsfiled as a bug here,但它看起来没有任何人正在研究它。

第二个链接中还有两种可能的解决方法。就个人而言,我倾向于将连接器功能放入assets文件夹中以保持资源树的清洁。

答案 2 :(得分:0)

这里对Gallery中使用的技术有更完整的解释:

http://www.virtudraft.com/blog/ajaxs-connector-file-using-modxs-main-index.php.html

它允许您创建一个连接器来运行您自己的处理器或内置的MODX处理器,而无需创建资源。