Избегайте доступа к профилям (пользователь/%пользователь/просмотр)


Я хочу избежать доступа к пользователь/%пользователь/просмотр, чтобы профили могли видеть только администраторы. Сначала я попытался изменить разрешение user_view_access, но безуспешно.

Я попытался использовать hook_меню_альтера:

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   );

Это тоже не работает. У вас есть какой-нибудь намек?

Author: kiamlaluno, 2011-04-19

5 answers

В коде, о котором вы сообщили, есть четыре проблемы:

  • Код изменяет тип меню, когда он не должен этого делать.
  • Код изменяет значения, которые он не должен касаться, если цель состоит в том, чтобы изменить только тех, кто может получить доступ к профилям пользователей.
  • user_edit_access() и user_access() ожидают, что полученный аргумент будет объектом пользователя, а не строкой. Неправильно устанавливать "аргументы доступа" в array('access administration pages'), как вы это делаете.
  • Даже если вы бы установили "аргументы доступа" в array(1), user_edit_access() позволяет пользователям видеть свой собственный профиль пользователя; если вы не хотите показывать пользователям их собственный профиль пользователя, то эта функция не является функцией, которую я бы использовал в качестве обратного вызова доступа.
  • Как сказал джедстром, в этом случае нет необходимости использовать код, когда достаточно не давать разрешения на доступ к профилям пользователей тем ролям, которые вы не хотите видеть, чтобы какой-либо профиль пользователя. Ответ, который я собираюсь дать, принимает предположение, что вы не хотите, чтобы пользователи видели какой-либо профиль пользователя, в том числе свой собственный; в этом случае удаление разрешения на доступ к профилям пользователей не помогает, так как 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
Author: kiamlaluno, 2012-11-21 11:18:04

Наконец-то я добился того, чего хотел:

  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
Author: penyaskito, 2011-04-20 06:51:13

Это немного запоздало, но я оставлю это здесь на случай, если у кого-то еще возникнет такая же проблема:)

Есть Доступ к пути:

Хотя многие модули Drupal предоставляют некоторую степень разрешений для контроля доступа, они никогда не охватывают все возможные требования пользователей . Path_access предоставляет средства для ограничения страниц на основе их псевдонима пути, что означает, что вы можете заблокировать определенные группы ролей пользователей от целые разделы сайта, использующие подстановочные знаки.

Но лучший вариант и модуль, который теперь находится в верхней части моего файла master.make, - это Кроличья нора, которая поддерживает пользовательские перенаправления для узлов, пользователей и терминов таксономии.

Кроличья нора - это модуль, который добавляет возможность контролировать, что должно происходить, когда объект просматривается на его собственной странице.

Возможно, у вас есть тип контента, который никогда не должен отображаться на отдельной странице, например, тип контента изображения, отображаемый в карусель. Кроличья нора может запретить доступ к этому узлу на его собственной странице через node/xxx.

 1
Author: Chapabu, 2012-11-21 09:02:12

Для этого трюка я использовал модуль 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
Author: mrded, 2012-11-21 11:21:15

Если вы хотите, чтобы пользователь мог редактировать свой собственный профиль, но не просматривать его:

Если вы уже используете модуль панелей, вы можете просто создать второй вариант в переопределении пользовательского представления, если (в правилах выбора) у пользователя нет разрешения, необходимого для просмотра обычной панели (например, Пользователь: Разрешение =>У вошедшего в систему пользователя есть "Просмотр профилей пользователей"). Вы выбираете код ответа HTTP и выбираете перенаправление 301 на user/%user:uid/edit.

Затем вы можете скрыть кнопку просмотра с помощью 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
Author: Vishnar Tadeleratha, 2015-04-04 08:33:59