2011-11-30 67 views
1

需要幫助在這個片段中的代碼,響應用戶#1,但不爲其他登錄或匿名用戶hook_menu_alter()響應不一致

function module_menu_alter(&$items) { 
    $items["node/add/page"]['access callback'] = 'module_access_callback'; 
} 

function module_access_callback(){  
    die('responding here - test'); 
} 

誰能告訴我什麼,我做錯了嗎?

+0

對已登錄用戶和匿名用戶的雙重檢查權限也許他們無權訪問「node/add/page」 –

+0

我對匿名和經過身份驗證的用戶設置了「訪問內容」權限。我無法想象其他任何需要設置的東西。 ??? – sisko

+0

@sisko:我只是想自己試試你的代碼,因爲我懷疑它會起作用,並且還有其他的力量(即某種節點訪問模塊)在這裏引發了這個問題。 – Clive

回答

0

如果這是你真正使用的代碼,然後訪問回調函數是錯誤的,因爲它應該返回TRUE在當前登錄的用戶可以訪問菜單,FALSE當用戶不能訪問到菜單。它不使用die()

這是在文檔中有什麼報道hook_menu()

「訪問回調」:函數返回TRUE如果用戶有權訪問該菜單項,並FALSE如果不是。它也可以是布爾常量而不是函數,也可以使用數值(將轉換爲布爾值)。除非值從父菜單項繼承,否則缺省爲user_access();只有MENU_DEFAULT_LOCAL_TASK項可以繼承訪問回調。要使用user_access()默認回調,您必須指定檢查爲「訪問參數」的權限。

如果您沒有顯示您正在使用的代碼,那麼下面的內容可以解釋您所看到的行爲。
第一個用戶或用戶#1是特定用戶,因爲user_access()總是爲該用戶返回TRUE。 這是該函數的代碼,其中明確檢查用戶ID明顯等於1

// User #1 has all privileges: 
if ($account->uid == 1) { 
    return TRUE; 
} 

如果接入回調返回FALSE爲authenthicated用戶,並且它是使用user_access(),這是因爲該驗證用戶沒有權限傳遞給該函數。

也可能是您正在檢查多個權限,並且您使用的是user_access('first permission') && user_access('second permission')而不是user_access('first permission') || user_access('second permission')(反之亦然)。對於沒有任何區別的用戶#1,作爲user_access('first permission') && user_access('second permission')user_access('first permission') || user_access('second permission')的結果始終是TRUE,即使您向該函數傳遞了未從任何模塊定義的權限的字符串。

+0

假設你是正確的,這是一個權限問題,我的已認證用戶已經有能力編輯特定的節點類型。除非有辦法確定創建問題的權限,否則有一種方法可以在模塊的單個部分中繞過user_access? – sisko

+0

定義訪問回調時,用戶可以根據從該函數返回的內容訪問該菜單,甚至不能使用'user_access()'。我不能再多說了,因爲您沒有顯示用於訪問回調的代碼。 (顯示的代碼只是測試代碼。) – kiamlaluno

+0

代碼基本上是我正在嘗試做的。如果你碰巧不是UID#1,它只是沒有迴應。 – sisko

0

OK原來,答案其實很簡單......

你打電話menu_get_object()檢索節點,但node/add/page不存在節點。事實恰恰相反;在頁面上有一個可用的節點來添加一個節點是沒有意義的,因爲它還沒有被創建!這是403的副作用。

您需要根據其他值(通常是登錄的用戶以及@kiamlaluno在他的回答中解釋得很好的權限)做出訪問決定。

而且一定要確保你從你的訪問回調返回TRUEFALSE作爲@kiamlaluno也表示:)

編輯

只是說,這是部分地回答https://stackoverflow.com/questions/8342169/drupal-hook-menu-alter-menu-get-object-error,這也解釋了爲什麼在這個答案中提到的功能在問題中沒有提到。