在ModX Revolution中实现前端Ajax功能的正确方法是什么?我喜欢连接器和处理器的想法,但由于某种原因它们仅用于后端使用 - modConnectorResponse
检查用户是否登录并返回“拒绝访问”,如果不是的话。
将一个片段插入资源并通过资源URL调用它似乎是一次性解决方案,但这对我来说并不合适。
那么如何为前端获得类似连接器的安全功能呢?
答案 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 forums和filed as a bug here,但它看起来没有任何人正在研究它。
第二个链接中还有两种可能的解决方法。就个人而言,我倾向于将连接器功能放入assets文件夹中以保持资源树的清洁。
答案 2 :(得分:0)
这里对Gallery中使用的技术有更完整的解释:
http://www.virtudraft.com/blog/ajaxs-connector-file-using-modxs-main-index.php.html
它允许您创建一个连接器来运行您自己的处理器或内置的MODX处理器,而无需创建资源。