在ModX Revolution中實現前端Ajax功能的正確方法是什麼?我喜歡連接器和處理器的想法,但由於某些原因,它們僅用於後端使用 - modConnectorResponse
檢查用戶是否已登錄並返回「拒絕訪問」(如果他不是)。ModX Revolution中的前端Ajax
將資源片段插入資源並通過資源URL調用它似乎是一次性解決方案,但這看起來並不正確。
那麼我如何才能獲得安全的前端連接器功能?
在ModX Revolution中實現前端Ajax功能的正確方法是什麼?我喜歡連接器和處理器的想法,但由於某些原因,它們僅用於後端使用 - modConnectorResponse
檢查用戶是否已登錄並返回「拒絕訪問」(如果他不是)。ModX Revolution中的前端Ajax
將資源片段插入資源並通過資源URL調用它似乎是一次性解決方案,但這看起來並不正確。
那麼我如何才能獲得安全的前端連接器功能?
因此,作爲boundaryfunctions said,這是不可能的,ModX開發人員建議使用包含單個代碼段的資源。但對於那些儘管開發人員願意尋找類似於連接器的功能的人來說,可能會有一種解決方案,通過猜測誰--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%安全的,但是,當匿名用戶的話來說,他似乎並沒有到管理記錄,當管理員是登錄並從後端調用該動作,則不會被強制註銷。這對我來說看起來足夠安全。
該解決方案仍然是可移植的(即可以嵌入到可分配的Extra中),但是對於嚴重項目而言,應該對安全性進行更嚴格的研究。
據我所知,目前在modX中這是不可能的。它已經是discussed on the modx forums和filed as a bug here,但它看起來並沒有任何人正在處理它。
在第二個鏈接中還有兩種可能的解決方法。就我個人而言,我傾向於將連接器功能放入資產文件夾以保持資源樹的清潔。
感謝您的鏈接,我也在搜索時發現他們。對我而言,擁有「幫手」資源也是錯誤的。我會發布我找到的解決方法。 – Hnatt
有沒有在畫廊這裏使用的技術的更完整的解釋:
http://www.virtudraft.com/blog/ajaxs-connector-file-using-modxs-main-index.php.html
它允許你創建一個連接器來運行你自己的處理器和內置鏌鋣處理器,而無需創建一個資源。
非常好的問題解決方案! – bfncs
更新,一些細節彈出。 – Hnatt