it-swarm-eu.dev

Zamezte přístupu k profilům (uživatel /% uživatel / zobrazení)

Chci se vyhnout přístupu k ser /% user/view, takže profily mohou vidět pouze administrátoři. Nejprve jsem se pokusil změnit povolení user_view_access bez štěstí.

Zkoušel jsem použít 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   );

Ani to nefunguje. Máte nějaký náznak?

3
penyaskito

S nahlášeným kódem jsou čtyři problémy:

  • Kód mění typ nabídky, pokud by to neměl dělat.
  • Kód mění hodnoty, na které by se neměl dotýkat, pokud je účelem pouze změnit, kdo má přístup k uživatelským profilům.
  • ser_edit_access () a ser_access () očekávají, že argument, který obdrží, bude objektem uživatele, nikoli řetězcem. Není správné nastavovat „argumenty přístupu“ na array('access administration pages'), jak to děláte.
  • I když byste nastavili „argumenty přístupu“ na array(1), user_edit_access() umožňuje uživatelům vidět jejich vlastní uživatelský profil; Pokud se chcete vyhnout tomu, aby se uživatelům zobrazoval jejich vlastní uživatelský profil, pak tato funkce není funkcí, kterou bych použil jako zpětné volání.
  • Jak uvedl jhedstrom, v tomto případě není nutné používat kód, když stačí udělit oprávnění k přístupu k uživatelským profilům těm rolím, které nechcete vidět žádný uživatelský profil. Odpověď, kterou hodlám dát, předpokládá, že nechcete, aby uživatelé viděli žádný uživatelský profil, včetně vlastního; v takovém případě odebrání povolení přístupu k uživatelským profilům nepomůže, protože Drupal stále umožňuje uživatelům vidět jejich vlastní uživatelský profil).
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

Pro tento trik jsem použil modul chain_menu_access . Kód níže.

/**
 * 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

Teď to přijde trochu pozdě, ale nechám to tady pro případ, že by někdo jiný měl stejný problém :)

Existuje Path Access :

Ačkoli mnoho modulů Drupal poskytuje určitá oprávnění pro řízení přístupu, nikdy se nevztahuje na všechny možné požadavky, které mají uživatelé. Path_access poskytuje prostředky k omezení stránek na základě jejich aliasů cesty - což znamená, že můžete uzamknout určité skupiny uživatelských rolí z celých částí webu pomocí zástupných znaků.

Ale nejlepší volba a modul, který je nyní na vrcholu mého hlavního souboru .make, je Rabbit Hole - který podporuje vlastní přesměrování pro uzly, uživatele a taxonomické termíny.

Králičí díra je modul, který přidává schopnost řídit, co by se mělo stát, když se entita prohlíží na své vlastní stránce.

Možná máte typ obsahu, který by se nikdy neměl zobrazovat na jeho vlastní stránce, jako je typ obsahu obrázku, který se zobrazuje v karuselu. Králičí díra může zabránit přístupu tohoto uzlu na jeho vlastní stránce prostřednictvím uzlu/xxx.

1
Chapabu

Nakonec jsem dosáhl toho, co jsem chtěl:

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

Děkujeme za vaše návrhy!

1
penyaskito

Chcete-li, aby uživatel mohl upravit svůj vlastní profil, ale nechat si jej zobrazit:

Pokud již modul Panels používáte, můžete jednoduše vytvořit druhou variantu v přepsání uživatelského pohledu, pokud (v pravidlech pro výběr) uživatel postrádá oprávnění potřebná pro zobrazení obvyklého panelu (například Uživatel: Oprávnění => Přihlášen uživatel má "Zobrazit uživatele" profily "). Vyberete HTTP Response Code a 301 přesměrování na user/%user:uid/edit.

Poté můžete skrýt tlačítko zobrazení pomocí CSS nebo implementovat výše uvedený kód:

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

nebo pomocí několika metod odebrat karty. Předpokládám, že následující by mělo fungovat v Drupal 7), ale možná to není ten správný způsob, nebo to má vedlejší účinky.

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