在 ModX Revolution 中实现前端 Ajax 功能的正确方法是什么?我喜欢连接器和处理器的想法,但由于某种原因,它们仅用于后端 -modConnectorResponse
检查用户是否登录并返回“拒绝访问”,如果他没有。
将片段插入资源并通过资源 URL 调用它似乎是一次性解决方案,但这对我来说并不合适。
那么如何为前端获得安全的类似连接器的功能呢?
在 ModX Revolution 中实现前端 Ajax 功能的正确方法是什么?我喜欢连接器和处理器的想法,但由于某种原因,它们仅用于后端 -modConnectorResponse
检查用户是否登录并返回“拒绝访问”,如果他没有。
将片段插入资源并通过资源 URL 调用它似乎是一次性解决方案,但这对我来说并不合适。
那么如何为前端获得安全的类似连接器的功能呢?
因此,正如边界函数所说,这是不可能的,ModX 开发人员建议使用包含单个片段的资源。但是对于那些不顾开发者意愿寻找类似Connector的功能的人来说,可能会有一个猜猜谁做出的解决方案——ModX核心开发者在Gallery extra中拆分。在调用之前,有一个伪造授权的代码: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
我自己的行动替换第一个条件。
更新:我忘了提到您需要&ctx=web
在 AJAX 请求中传递参数,因为连接器的默认上下文是“ mgr
”,并且匿名用户不会通过策略检查(除非您mgr
为匿名用户设置对“”上下文的访问权限)。
而且我在这里发布的来自 Gallery extra 的代码似乎检查了一些对我来说不适用于匿名前端用户的会话内容(并且仅在我登录到后端时才有效),所以我将其替换为下一个:
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,当管理员登录并从后端调用操作时,他不是强行注销。这对我来说似乎足够安全。
这个解决方案仍然是可移植的(即可以嵌入到可分发的Extra中),但是对于严肃的项目应该更加认真地研究安全性。
据我所知,目前这在 modX 中是不可能的。它已经在 modx 论坛上讨论过,并在此处作为错误提交,但看起来没有人在处理它。
第二个链接中还有两种可能的解决方法。就个人而言,我更倾向于将连接器功能放入资产文件夹以保持资源树的清洁。
这里对 Gallery 中使用的技术有更完整的解释:
http://www.virtudraft.com/blog/ajaxs-connector-file-using-modxs-main-index.php.html
它允许您创建连接器来运行您自己的处理器或内置 MODX 处理器,而无需创建资源。