2010-09-16 50 views
4

如何爲某些節點發出403?我嘗試使用drupal_access_denied。雖然我得到了一個訪問被拒絕的消息,看門狗充滿:爲某些節點發出403

不能更改頭信息 - 頭已經發出已

是正常嗎?我沒有使用drupal_access_denied的權利?

+2

你在哪裏發出拒絕?在主題中,爲時已晚。但是,您可以在沒有問題的hook_nodeapi中執行該操作。 – berkes 2010-09-16 20:46:41

+0

加載操作中的hook_nodeapi是我擁有它的地方。是否可能登錄平底雪橇干擾? – Kevin 2010-09-16 23:34:03

回答

5

使用建議的hook_nodeapi()還爲時過晚。

如果你使用$op = load,你可能會耗盡你的內存,因爲Drupal已經承諾它加載一個節點(包括多次加載它)時所做的所有正常事情。

如果使用$op = view,你可以「假」,如果你做到以下幾點:

function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { 
    switch ($op) { 
    case 'view': 
     drupal_access_denied(); 
     exit(); 
     break; 
    } 
} 

但它不是一個真正的403,它不會被報告爲這樣除了看門狗,所有的正常的東西仍然會加載和渲染,就像節點在那裏一樣。

對於一個簡單的黑客,你可以使用hook_init()

function mymodule_init() { 
    $nodes_403 = array(42, 69, 187); 
    if (arg(0) == 'node' && in_array(arg(1), $nodes_403)) 
    drupal_access_denied(); 
    exit(); 
    } 
} 

但是,這不必要的繞過Drupal的內置的權限系統。相反,您希望利用Drupal的node access rights系統拒絕對節點的訪問。

如果你定義的模塊在自己的內容類型,你可以使用hook_access()

function mymodule_access($op, $node, $account) { 
    $nodes_403 = array(42, 69, 187); 

    if (in_array($node->nid, $nodes_403)) { 
    return FALSE; 
    } 
} 

但是,如果你沒有定義自己的自定義內容類型,則永遠不會調用hook_access()。因此,相反,你需要重寫節點路徑的access callback用自己:

function mymodule_menu_alter(&$items) { 
    $items['node/%node']['access callback'] = 'mymodule_access'; 
} 

function mymodule_access($op, $node, $account = NULL) { 
    $nodes_403 = array(42, 69, 187); 

    if ($op == 'view' && in_array($node->nid, $nodes_403)) { 
    return FALSE; 
    } 

    return node_access($op, $node, $account); 
} 

因爲hook_menu_alter()落實,確保實現上述後重建你的菜單系統。

+0

我能夠通過執行drupal_access_denied()獲得'headers'錯誤。打破;在每次檢查 - 但我也會看你的方法。希望這種解釋是在API中。 http://api.drupal.org/api/function/drupal_access_denied/6 – Kevin 2010-09-17 12:49:47

+0

@Kevin:節點訪問API的記錄非常糟糕,當它開始時設計得不好的時候沒有幫助(爲什麼我只能使用'hook_access ()'當我定義我自己的自定義內容類型時,而不是在所有節點上?或者就此而言,在任何*頁上)。 Drupal 7清理了API,希望文檔能夠得到一些愛。 – 2010-09-17 16:32:42

+0

是的 - 我注意到這是爲用戶0打破某些cron函數。我重構了您的方法。另外,我瘋了,還是nodeapi視圖案不能像你期望的那樣工作? – Kevin 2010-09-17 17:20:07