web-dev-qa-db-ja.com

プロファイルへのアクセスを回避(ユーザー/%user /ビュー)

ser /%user/viewへのアクセスを避けたいので、管理者だけがプロファイルを表示できます。最初は運が悪いので、user_view_accessパーミッションを変更してみました。

フックhook_menu_alterを使用しようとしました:

53 function mymenu_menu_alter(&$items) {
54   $items['user'] = array(
55     'access callback' => 'user_access',                                                                                                                                                                                                  
56     'access arguments' => array('access administration pages'),                                                                                                                                                                         
57     'type' => MENU_NORMAL_ITEM,
58   );
59   $items['user/%user_uid_optional'] = array(
60     'access callback' => 'user_access',
61     'access arguments' => array('access administration pages'),
62      'type' => MENU_NORMAL_ITEM,
63   );
64   $items['user/%user/view'] = array(
65     'access callback' => 'user_edit_access',
66     'access arguments' => array('access administration pages'),
67     'type' => MENU_NORMAL_ITEM,
68   );

どちらも機能しません。ヒントはありますか?

3
penyaskito

報告したコードには4つの問題があります。

  • コードは、メニュータイプを変更すべきではないときに変更しています。
  • 目的がユーザープロファイルにアクセスできるユーザーのみを変更することである場合、コードは変更すべきではない値を変更しています。
  • ser_edit_access() および ser_access() が受け取る引数は、文字列ではなくユーザーオブジェクトであると想定しています。 「アクセス引数」をarray('access administration pages')に設定するのは間違っています。
  • 「アクセス引数」をarray(1)に設定する場合でも、user_edit_access()を使用すると、ユーザーは自分のユーザープロファイルを表示できます。ユーザーに自分のユーザープロファイルを表示したくない場合、その関数はアクセスコールバックとして使用する関数ではありません。
  • Jhedstromで述べたように、この場合はコードを使用する必要はありません。ユーザープロファイルにアクセスするための権限を、ユーザープロファイルを表示したくないロールに付与しないことで十分です。これからお答えするのは、ユーザーが自分のプロファイルを含め、ユーザープロファイルを表示しないようにすることです。この場合、Drupalでもユーザーが自分のユーザープロファイルを表示できるようにするため、ユーザープロファイルへのアクセス許可を削除しても効果がありません。
function mymenu_menu_alter(&$items) {
  $items['user/%user/view']['access callback'] = FALSE;
}

function mymenu_user_view_access($account) {
  return $account && $account->uid && user_access('administer users');
}
6
kiamlaluno

このトリックでは chain_menu_access モジュールを使用しました。以下のコード。

/**
 * Implements hook_menu_alter().
 */
function mymodule_menu_alter(&$items) {
  chain_menu_access_chain($items, 'user/%user', '_mymodule_check_permission');
}

function _mymodule_check_permission() {
  global $user;

  $own_profile = $user->uid == arg(1);
  $has_access = user_access('administer users');

  return (!$has_access && !$own_profile) ? FALSE : TRUE;
}
1
mrded

これは少し遅れますが、他の誰かが同じ問題を抱えている場合に備えて、ここに置いておきます:)

パスアクセス

Drupalモジュールの多くはある程度のアクセス制御権限を提供しますが、ユーザーが持つ可能性のあるすべての要件をカバーすることは決してできません。Path_accessは、パスエイリアスに基づいてページを制限する手段を提供します。つまり、ロックアウトできます。ワイルドカードを使用したサイトのセクション全体からの特定のユーザー役割グループ。

しかし、最良のオプションであり、現在私のマスター.makeファイルの一番上にあるモジュールは Rabbit Hole -で、ノード、ユーザー、および分類用語のカスタムリダイレクトをサポートしています。

ウサギの穴は、エンティティが独自のページで表示されているときに何が起こるかを制御する機能を追加するモジュールです。

カルーセルに表示される画像コンテンツタイプのように、独自のページに表示されるべきではないコンテンツタイプがある可能性があります。 Rabbit Holeは、node/xxxを通じて、このノードが独自のページでアクセスできないようにすることができます。

1
Chapabu

最後に私は私が欲しかったものを達成しました:

  function mymenu_menu_alter(&$items) {
   $items['user/%user_uid_optional'] = array(
      'page callback' => '_mymenu_profile_view',
      'page arguments' => array(1),
      'type' => MENU_LOCAL_TASK,
    );  
  }

  function _mymenu_profile_view($account) {
    global $user;
    if (user_access('administer users')) {
      include_once(drupal_get_path('module', 'user').'/user.pages.inc');
      return user_view($account);
    } else {
      return drupal_not_found();
    }   
  }

あなたの提案をありがとう!

1
penyaskito

ユーザーが自分のプロファイルを編集できるが、表示できないようにする場合:

すでにPanelsモジュールを使用している場合、(選択ルールで)ユーザーが通常のパネルを表示するために必要な権限を持っていない場合(User:Permission => Logged in user has "View userプロファイル」)。 HTTP応答コードを選択し、user/%user:uid/editへの301リダイレクトを選択します。

次に、CSSでビューボタンを非表示にするか、上記のコードを実装します。

function mymodule_menu_alter(&$items) {
  $items['user/%user/view']['access callback'] = '_mymodule_user_view_access';
  $items['user/%user/view']['access arguments'] = array(1);
}

function _mymodule_user_view_access($account) {
  return $account && $account->uid && user_access('administer users');
}

または、いくつかの方法を使用してタブを削除します。以下はDrupal 7で動作するはずですが、正しい方法ではないか、副作用があると思います。

function mymodule_menu_local_tasks_alter(&$data) {
  foreach ($data['tabs'][0]['output'] as $key => $value) {
    if ($value['#link']['path'] == "user/%/view") {
      unset($data['tabs'][0]['output'][$key]);
    }
  }
}
0