Wie kann ich feststellen, ob ein Benutzer berechtigt ist, auf eine bestimmte Seite zuzugreifen?
Wie kann ich feststellen, ob ein Benutzer berechtigt ist, auf eine bestimmte Seite zuzugreifen?
Antworten:
Wenn Sie überprüfen möchten, ob der aktuell angemeldete Benutzer Zugriff auf eine Seite hat, können Sie den folgenden Code verwenden:
if ($router_item = menu_get_item($path)) {
if ($router_item['access']) {
// The user has access to the page in $path.
}
}
$path
ist der Pfad der Seite, die Sie überprüfen möchten (z. B. Knoten / 1, Administrator / Benutzer / Benutzer).
Der Code funktioniert in Drupal 6 und höheren Versionen und wird von menu_execute_active_handler () verwendet .
Der Grund, warum ich nicht vorschlage, den Zugriffsrückruf direkt aufzurufen, ist, dass die Argumente an diese Funktion übergeben werden müssen.
Der von _menu_check_access () verwendete Code ist der folgende (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);
}
Der Code, der so allgemein wie möglich sein muss, behandelt ein Benutzerobjekt nicht direkt. Dies bedeutet, dass das Benutzerobjekt für den aktuell angemeldeten Benutzer nicht durch ein anderes Benutzerobjekt ersetzt werden kann.
Der Code muss generisch genug sein, um Menüdefinitionen wie die folgenden verarbeiten zu können:
$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 beiden Definitionen enthalten die Zugriffsargumente kein Benutzerobjekt, und node_access () verwendet in diesem Fall das Benutzerobjekt für den derzeit angemeldeten Benutzer. Im zweiten Fall ist eines der Argumente das Knotenobjekt, das von der URL abgerufen wird. Wenn die URL beispielsweise example.com/node/1 lautet, ist das zweite Argument, das an den Zugriffsrückruf übergeben wird, das Knotenobjekt für den Knoten mit der Knoten-ID 1. Das
Schreiben von Code, der auch diese Fälle behandelt, bedeutet, Code zu duplizieren in Drupal bereits vorhanden. Auch wenn Sie diesen Code dupliziert haben, besteht immer noch das Problem der Zugriffsrückrufe, die den Zugriff auf den aktuell angemeldeten Benutzer überprüfen.
Wenn Sie überprüfen möchten, ob ein Benutzer, der nicht der aktuell angemeldete Benutzer ist, auf ein Menü zugreifen kann, ändern Sie zuerst den Wert der globalen Variablen $user
, verwenden Sie den Code, den ich am Anfang meiner Antwort angegeben habe, und stellen Sie dann den Wert von wieder her $user
. Informationen zum Ändern des globalen Werts $user
finden Sie unter Programmgesteuerter Identitätswechsel für einen anderen Benutzer, ohne dass sich der aktuell angemeldete Benutzer abmeldet . Der Unterschied besteht darin, dass Sie anstelle des von drupal_anonymous_user () zurückgegebenen Werts den von user_load () zurückgegebenen Wert verwenden .
Versuchen Sie es mit drupal_valid_path () .
Die Funktion gibt TRUE
den Pfad zurück, der als Argument übergeben wurde und auf den der aktuelle Benutzer Zugriff hat. Wenn Sie also an Drupal 7 arbeiten und den Zugriff auf den aktuell angemeldeten Benutzer überprüfen müssen, ist dies der einfachste Weg:
if (drupal_valid_path('my/path')) {
// Your code here...
}
drupal_valid_path
macht es die Arbeit perfekt und ist dafür gemacht, genau dieses Bedürfnis zu erfüllen. Es verwendet menu_get_item und überprüft auch den Zugriff.
drupal_valid_path
hilft Ihnen das nicht weiter.
\Drupal::service('path.validator')->isValid($path);
- siehe API-Dokumentation
Rufen Sie das auf access callback
, das im Menüeintrag angegeben ist, der für die Seite verantwortlich ist. Dieser Menüeintrag wird normalerweise von Drupal erstellt, der die Implementierung von aufruft, hook_menu
und ist irgendwo in der Datenbank gespeichert. Beachten Sie, dass die von zurückgegebenen Daten hook_menu
möglicherweise von einem implementierenden Modul geändert werden hook_menu_alter
.
Beachten Sie, dass einige Module den Benutzer möglicherweise nicht als separates Argument übergeben (wie durch den access arguments
Schlüssel des Menüeintrags angegeben), sondern stattdessen das globale $user
Objekt verwenden. Sie müssen dies für jedes verwendete Modul überprüfen.
Überprüfen Sie die user_access()
Funktion. Siehe den Link für die angegebenen Parameter für jede Version von Drupal. Auf der Dokumentationsseite für Drupal 7-8:
Parameter
$ string Die Berechtigung, z. B. "Knoten verwalten", auf die geprüft wird.
$ account (optional) Das zu überprüfende Konto, falls nicht angegeben, der aktuell angemeldete Benutzer.
Rückgabewert
Boolean TRUE, wenn der aktuelle Benutzer die angeforderte Berechtigung hat.
Alle Berechtigungsprüfungen in Drupal sollten diese Funktion durchlaufen. Auf diese Weise garantieren wir ein konsistentes Verhalten und stellen sicher, dass der Superuser alle Aktionen ausführen kann.
user_access()
ist nicht immer der von einem Menü verwendete Zugriffsrückruf; Trotzdem sollten Sie die Zugriffsargumente kennen, an die Sie übergeben müssen user_access()
.
user_access()
der Fall ist. Ich habe nur gedacht, dass das OP eine Berechtigung hat, um zu prüfen, ob der Benutzer Zugriff haben sollte. Keine sehr beschreibende Frage
Wenn Sie wissen möchten, ob ein Benutzer auf einen bestimmten Knoten zugreifen kann und ein Knotenzugriffsmodul verwendet, können Sie node_access () verwenden . (Ohne ein Knotenzugriffsmodul benötigen sie lediglich die Berechtigung "Zugriff auf Inhalte".)
Wenn Sie herausfinden möchten, ob ein Benutzer auf einen beliebigen Pfad zugreifen kann, der durch eine Implementierung von hook_menu () definiert ist, müssen Sie möglicherweise den Menüeintrag aus der Datenbank abrufen und seinen Parameter 'access callback' auswerten.
$node = node_load(123);
$account = user_load(456);
if (node_access("update", $node, $account) === TRUE)
{
print "access";
}