如何爲某些節點發出403?我嘗試使用drupal_access_denied。雖然我得到了一個訪問被拒絕的消息,看門狗充滿:爲某些節點發出403
不能更改頭信息 - 頭已經發出已
是正常嗎?我沒有使用drupal_access_denied的權利?
如何爲某些節點發出403?我嘗試使用drupal_access_denied。雖然我得到了一個訪問被拒絕的消息,看門狗充滿:爲某些節點發出403
不能更改頭信息 - 頭已經發出已
是正常嗎?我沒有使用drupal_access_denied的權利?
使用建議的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()
落實,確保實現上述後重建你的菜單系統。
我能夠通過執行drupal_access_denied()獲得'headers'錯誤。打破;在每次檢查 - 但我也會看你的方法。希望這種解釋是在API中。 http://api.drupal.org/api/function/drupal_access_denied/6 – Kevin 2010-09-17 12:49:47
@Kevin:節點訪問API的記錄非常糟糕,當它開始時設計得不好的時候沒有幫助(爲什麼我只能使用'hook_access ()'當我定義我自己的自定義內容類型時,而不是在所有節點上?或者就此而言,在任何*頁上)。 Drupal 7清理了API,希望文檔能夠得到一些愛。 – 2010-09-17 16:32:42
是的 - 我注意到這是爲用戶0打破某些cron函數。我重構了您的方法。另外,我瘋了,還是nodeapi視圖案不能像你期望的那樣工作? – Kevin 2010-09-17 17:20:07
你在哪裏發出拒絕?在主題中,爲時已晚。但是,您可以在沒有問題的hook_nodeapi中執行該操作。 – berkes 2010-09-16 20:46:41
加載操作中的hook_nodeapi是我擁有它的地方。是否可能登錄平底雪橇干擾? – Kevin 2010-09-16 23:34:03