it-swarm.it

Controlla se l'utente ha accesso a una determinata pagina

Come posso determinare se un utente è autorizzato ad accedere a una determinata pagina?

23
farzan

Se si desidera verificare se l'utente attualmente connesso ha accesso a una pagina, è possibile utilizzare il seguente codice:

if ($router_item = menu_get_item($path)) {
  if ($router_item['access']) {
    // The user has access to the page in $path.
  }
}

$path è il percorso della pagina che desideri controllare (ad esempio nodo/1, admin/utente/utente).

Il codice funziona in Drupal 6 e versioni successive, ed è quello usato da menu_execute_active_handler () .

Il motivo per cui non sto suggerendo di chiamare direttamente il callback di accesso è perché gli argomenti che devono essere passati a quella funzione.

Il codice utilizzato da _ menu_check_access () è il seguente (Drupal 7):

$arguments = menu_unserialize($item['access_arguments'], $map);
// As call_user_func_array is quite slow and user_access is a very common
// callback, it is worth making a special case for it.
if ($callback == 'user_access') {
  $item['access'] = (count($arguments) == 1) ? user_access($arguments[0]) : user_access($arguments[0], $arguments[1]);
}
elseif (function_exists($callback)) {
  $item['access'] = call_user_func_array($callback, $arguments);
}

Il codice, che deve essere il più generico possibile, non gestisce direttamente un oggetto utente. Ciò significa che non è possibile sostituire l'oggetto utente per l'utente attualmente connesso con un altro oggetto utente.
Il codice deve essere abbastanza generico per gestire definizioni di menu come quelle seguenti:

$items['node/add/' . $type_url_str] = array(
  'title' => $type->name, 
  'title callback' => 'check_plain', 
  'page callback' => 'node_add', 
  'page arguments' => array($type->type), 
  'access callback' => 'node_access', 
  'access arguments' => array('create', $type->type), 
  'description' => $type->description, 
  'file' => 'node.pages.inc',
);

$items['node/%node'] = array(
  'title callback' => 'node_page_title', 
  'title arguments' => array(1),
  // The page callback also invokes drupal_set_title() in case
  // the menu router's title is overridden by a menu link. 
  'page callback' => 'node_page_view', 
  'page arguments' => array(1), 
  'access callback' => 'node_access', 
  'access arguments' => array('view', 1),
);

In entrambe le definizioni, gli argomenti di accesso non includono un oggetto utente e node_access () in questo caso utilizza l'oggetto utente per l'utente attualmente connesso. Nel secondo caso uno degli argomenti è l'oggetto nodo ottenuto dall'URL; ad esempio, se l'URL è example.com/node/1, il secondo argomento passato al callback di accesso è l'oggetto nodo per il nodo con ID nodo uguale a 1.
Scrivere codice che gestisca anche questi casi significherebbe duplicare il codice già esistente in Drupal. Anche se hai duplicato quel codice, ci sarebbe ancora il problema dei callback di accesso che stanno verificando l'accesso rispetto all'utente attualmente connesso.

Se si desidera verificare se un utente che non è l'utente attualmente connesso può accedere a un menu, è innanzitutto necessario modificare il valore della variabile globale $user, utilizza il codice che ho segnalato all'inizio della mia risposta, quindi ripristina il valore di $user. Per come modificare il valore del globale $user, puoi vedere Rappresentare a livello di codice un altro utente senza causare la disconnessione dell'utente attualmente connesso . La differenza è che, invece di utilizzare il valore restituito da drupal_anonymous_user () , si utilizza il valore restituito da ser_load () .

25
kiamlaluno

Prova drupal_valid_path () .

La funzione restituisce TRUE è il percorso passato come argomento esistente e l'utente corrente ha accesso ad esso. Quindi, se stai lavorando su Drupal 7 e devi controllare l'accesso dell'utente attualmente connesso, è il modo più semplice di procedere:

if (drupal_valid_path('my/path')) {
  // Your code here...
}
14
peterpoe

Chiama il access callback Specificato nella voce di menu responsabile della pagina. Quella voce di menu viene solitamente creata da Drupal chiamando l'implementazione di hook_menu e viene memorizzata da qualche parte nel database. Attenzione che i dati restituiti da hook_menu Potrebbe essere modificato da un modulo che implementa hook_menu_alter .

Attenzione che alcuni moduli potrebbero non passare l'utente come argomento separato (come specificato dal tasto access arguments Della voce di menu), ma potrebbero invece utilizzare l'oggetto globale $user. Dovrai verificarlo per ogni modulo che usi.

3
Oswald

Dai un'occhiata alla funzione user_access() . Vedi il link per i parametri specificati per ogni versione di Drupal. Dalla pagina della documentazione per Drupal 7-8:

Parametri

$ string L'autorizzazione, ad esempio "gestisci nodi", viene controllata.

$ account (facoltativo) L'account da verificare, se non fornito, utilizza l'utente attualmente connesso.

Valore restituito

Boolean TRUE se l'utente corrente dispone dell'autorizzazione richiesta.

Tutti i controlli di autorizzazione in Drupal dovrebbe passare attraverso questa funzione. In questo modo, garantiamo un comportamento coerente e assicuriamo che il superutente possa eseguire tutte le azioni.

2
Laxman13

Se devi sapere se un utente può accedere a un determinato nodo e utilizza un modulo di accesso al nodo, puoi utilizzare node_access () . (senza un modulo di accesso al nodo hanno solo bisogno dell'autorizzazione 'access content').

Se si desidera capire se un utente può accedere a un percorso arbitrario definito da un'implementazione hook_menu (), potrebbe essere necessario recuperare la voce di menu dal database e valutare il parametro 'access callback'.

2
gapple
    $node = node_load(123);

    $account = user_load(456);

    if (node_access("update", $node, $account) === TRUE) 
   {

         print "access";    
    }
2
Mahipal Purohit