2012-05-01 27 views
1

在ModX Revolution中實現前端Ajax功能的正確方法是什麼?我喜歡連接器和處理器的想法,但由於某些原因,它們僅用於後端使用 - modConnectorResponse檢查用戶是否已登錄並返回「拒絕訪問」(如果他不是)。ModX Revolution中的前端Ajax

將資源片段插入資源並通過資源URL調用它似乎是一次性解決方案,但這看起來並不正確。

那麼我如何才能獲得安全的前端連接器功能?

回答

2

因此,作爲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中),但是對於嚴重項目而言,應該對安全性進行更嚴格的研究。

+0

非常好的問題解決方案! – bfncs

+0

更新,一些細節彈出。 – Hnatt

1

據我所知,目前在modX中這是不可能的。它已經是discussed on the modx forumsfiled as a bug here,但它看起來並沒有任何人正在處理它。

在第二個鏈接中還有兩種可能的解決方法。就我個人而言,我傾向於將連接器功能放入資產文件夾以保持資源樹的清潔。

+0

感謝您的鏈接,我也在搜索時發現他們。對我而言,擁有「幫手」資源也是錯誤的。我會發布我找到的解決方法。 – Hnatt

相關問題