Verhindern Sie, dass Benutzer ihr eigenes Profil bearbeiten oder anzeigen

7

Wie kann der Zugriff auf das Benutzerprofil zum Anzeigen und Bearbeiten am besten deaktiviert werden? Grundsätzlich können Benutzer ein Konto erstellen, jedoch nicht in der Lage sein, ihre eigenen oder die Profile anderer Benutzer zu bearbeiten oder anzuzeigen.

space_balls
quelle

Antworten:

11

Fügen Sie dies einem benutzerdefinierten Modul hinzu:

function MYMODULE_menu_alter(&$items) {
  $items['user/%user']['access arguments'] = array('access user profiles');
  $items['user/%user']['access callback'] = 'user_access';
  $items['user/%user/edit']['access arguments'] = array('administer users');
  $items['user/%user/edit']['access callback'] = 'user_access';
}

Dadurch wird die Benutzerprofilansicht unter die Berechtigung "Benutzerprofile anzeigen" gestellt und unter "Benutzer verwalten" bearbeitet.

J. Reynolds
quelle
vielen Dank! arbeitete ein Vergnügen. Ich dachte, dass ich versucht habe, dies mit hook_menu zu tun, aber ich nehme an, es war an der falschen Stelle und sollte in hook_menu_alter
space_balls
Einfach großartig. Ich suchte nach einem dazugehörigen Modul. Aber diese Antwort hat die Arbeit in mindestens Codezeilen erledigt.
Schüler
7

Da die Frage nicht spezifisch für Drupal 7 zu sein scheint, gehen Sie in Drupal 8 folgendermaßen vor: hook_menu_alter ist nicht mehr vorhanden. Jetzt verwenden Sie einen RouteSubscriber. Wie dies funktioniert, können Sie hier sehen: https://www.drupal.org/docs/8/api/routing-system/altering-existing-routes-and-adding-new-routes-based-on-dynamic-ones

Der RouteSubscriber würde folgendermaßen aussehen:

<?php

namespace Drupal\my_module\Services;

use Drupal\Core\Routing\RouteSubscriberBase;
use Symfony\Component\Routing\RouteCollection;

/**
 * Listens to the dynamic route events.
 */
class RouteSubscriber extends RouteSubscriberBase {

  /**
   * {@inheritdoc}
   */
  protected function alterRoutes(RouteCollection $collection) {

    // Edit user
    if ($route = $collection->get('entity.user.edit_form')) {
      $route->setRequirement('_permission', 'administer users');
    }

    // View user
    if ($route = $collection->get('entity.user.canonical')) {
      $route->setRequirement('_permission', 'administer users');
    }
  }
}

Die Routennamen stammen aus dem Kernbenutzermodul. In "setRequirement" können Sie alles tun, was Sie in der normalen Routenkonfiguration tun können. Beachten Sie, dass setRequirement eine Berechtigung (oder Rolle usw.) hinzufügt, die Anforderung ["_entity_access"] => "user.update" jedoch weiterhin Teil der Route ist.

Dann müssen Sie den Dienst in der Dienst-Yaml-Datei Ihres Moduls registrieren:

services:
  my_module.route_subscriber:
    class: Drupal\my_module\Services\RouteSubscriber
    tags:
      - { name: event_subscriber }
Narretz
quelle
0

Anstatt ein Modul dafür zu erstellen, können Sie einfach eine Regel erstellen.

Hier ist eine Anleitung:

Schritt 1: Erstellen Sie eine Regel, die auf dieses Ereignis einwirkt: "Benutzerkontoseite wird angezeigt"

Schritt 2: Legen Sie eine Bedingung fest, etwa: "NICHT Benutzer hat Rolle (n) Parameter: Benutzer: [Konto], Rollen: Administrator"

Schritt 3: Erstellen Sie eine Aktion: "Seitenumleitung Parameter: URL: toboggan / verweigert" (falls Sie Login-Rodel verwenden, aber eine Seiten-URL hier funktionieren sollte, damit Sie eine Seite speziell für diese erstellen können, die etwa Folgendes sagt: "Wir sind Es tut mir sehr leid, aber im Moment können Sie nicht auf Ihre Profilseite zugreifen. "

Schritt 4: Aktivieren Sie diese Regel, wenn Sie beispielsweise die neueste Version Ihrer Produktionssite herunterladen, eine SQL-Sicherung herunterladen, lokal damit herumspielen und sie dann erneut hochladen möchten, ohne Benutzer zu enttäuschen, die möglicherweise aktualisieren möchten ihr Profil in der Zwischenzeit.

Darüber hinaus können Sie eine weitere Bedingung hinzufügen, um zu überprüfen, ob der Benutzer die Profilseite eines anderen Benutzers oder seine eigene anzeigt, sodass Sie zwei verschiedene Regeln festlegen, von denen eine Seite anzeigt, dass er sein Profil vorübergehend nicht aktualisieren kann, und eine andere Regel, die a anzeigt Seite, auf der angegeben ist, warum das Profil eines bestimmten Benutzers nicht angezeigt werden kann.

Ich habe dies getestet und diese Bedingung hinzugefügt: "Datenvergleich Parameter: Zu vergleichende Daten: [Konto], Datenwert: [Site: aktueller Benutzer]" Dadurch wird nur der Zugriff verweigert, um das eigene Konto anzuzeigen und dann das anzuzeigen Die richtige Seite, die Sie für diesen verweigerten Zugriff erstellt haben. Ich denke, das macht mehr Sinn.

BassPlaya
quelle
Immer aufgeregt, die Macht der Regeln zu nutzen. Dies funktionierte jedoch nicht, wenn der Benutzer die direkte URL zur Bearbeitungsseite / user / nn / edit hat. Es verhindert jedoch, dass sie zur / user-Seite gelangen.
Tony
Gut erkannt. Wenn wir nur eine weitere Bedingung hinzufügen könnten, die prüft, ob eine URL vom Zeichenfolgenbenutzer / * stammt, werden wir gespeichert. Ich habe es mit einem Textvergleich versucht, bei dem [account: edit-url] und [site: current-user: edit-url] verglichen wurden, aber das hat nicht funktioniert. Der Zustand "Pfad hat URL-Alias" [Site: aktueller Benutzer: URL bearbeiten] wurde ebenfalls nicht ausgeführt. Ich werde weiter suchen.
BassPlaya
Ich konnte es nicht herausfinden und der Code aus der akzeptierten Antwort funktionierte gut, also gab ich auf.
Tony