1

このコード スニペットは、user#1 には応答しますが、他のログイン ユーザーまたは匿名ユーザーには応答しません。

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

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

私は何を間違っていますか?

4

2 に答える 2

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れ、それが を使用してuser_access()いる場合は、認証されたユーザーが関数に渡されたアクセス許可を持っていないことが原因です。

複数のパーミッションをチェックしていてuser_access('first permission') && user_access('second permission')、代わりに ,を使用している可能性もありますuser_access('first permission') || user_access('second permission')(またはその逆)。どのモジュールからも定義されていない権限の文字列を関数に渡しても、user_access('first permission') && user_access('second permission')and user_access('first permission') || user_access('second permission')is alwaysの結果として、何の違いも生じないユーザー #1 の場合。TRUE

于 2011-11-30T16:34:52.170 に答える
0

OK 答えは実際には非常に単純であることがわかりました...

ノードを取得するために呼び出しmenu_get_object()ていますが、 にノードが存在しませんnode/add/page。実際、まったく逆です。まだ作成されていないため、ノードを追加するためにページでノードを使用できるようにしても意味がありません。403 はこれの副作用です。

他の値に基づいてアクセスの決定を行う必要があります (通常、@kiamlaluno が彼の回答で非常にうまく説明しているため、アクセス許可と共にログインしているユーザー)。

また、@kiamlalunoも述べているように、アクセスコールバックから戻るTRUEかどうかを確認してください:)FALSE

編集

これは部分的にhttps://stackoverflow.com/questions/8342169/drupal-hook-menu-alter-menu-get-object-errorへの回答であり、この回答で言及されている機能がある理由を説明しています質問には記載されていません。

于 2011-12-01T14:23:29.833 に答える