web-dev-qa-db-fra.com

Évitez l'accès aux profils (utilisateur /% utilisateur / vue)

Je souhaite éviter l'accès à tilisateur /% utilisateur/vue, alors seul des administrateurs peuvent voir des profils. Au début, j'ai essayé de changer l'autorisation user_view_access sans aucune chance.

J'ai essayé d'utiliser le crochet 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   );

Cela ne marche pas non plus. Avez-vous un indice?

3
penyaskito

Il y a quatre problèmes avec le code que vous avez signalé:

  • Le code change le type de menu, quand il ne devrait pas le faire.
  • Le code change des valeurs qu'il ne doit pas toucher, si l'objectif est de changer uniquement qui peut accéder aux profils utilisateur.
  • ser_edit_access () et ser_access () Attendez-vous à l'argument qu'ils reçoivent être un objet utilisateur, pas une chaîne. Il est faux de définir des "arguments d'accès" à array('access administration pages'), comme vous le faites.
  • Même si vous définissez "Arguments d'accès" à array(1), user_edit_access() permet aux utilisateurs de voir leur propre profil d'utilisateur; Si vous souhaitez éviter de montrer aux utilisateurs leur propre profil utilisateur, cette fonction n'est pas la fonction que j'utiliserais comme rappel d'accès.
  • Comme indiqué par JHEDSTROM, il n'est pas nécessaire d'utiliser le code dans ce cas, lorsqu'il suffit de ne pas donner l'autorisation d'accéder aux profils d'utilisateurs à ces rôles, vous ne voulez pas pouvoir voir un profil utilisateur. La réponse que je vais donner prend l'hypothèse que vous ne voulez pas que les utilisateurs voient un profil utilisateur, y compris leur propre; Dans ce cas, supprimer la permission d'accéder aux profils d'utilisateurs n'aident pas, comme Drupal permet toujours aux utilisateurs de voir leur propre profil utilisateur.
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

Enfin j'ai atteint ce que je voulais avec:

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

Merci pour vos suggestions!

1
penyaskito