web-dev-qa-db-fra.com

Empêcher les utilisateurs de modifier ou d'afficher leur propre profil

Quelle est la meilleure façon de désactiver l'accès au profil de l'utilisateur pour l'affichage et la modification? Fondamentalement, les utilisateurs peuvent créer un compte mais ne pourront pas modifier ou afficher leur propre profil ou celui d'autres utilisateurs.

7
space_balls

Ajoutez ceci à un module personnalisé:

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

Cela mettra la vue du profil utilisateur sous l'autorisation "Afficher les profils utilisateur" et la modifier sous "Administrer les utilisateurs".

11
J. Reynolds

Étant donné que la question ne semble pas être spécifique pour Drupal 7, voici comment vous le faites dans Drupal 8. hook_menu_alter n'est plus, maintenant vous utilisez un RouteSubscriber. Vous pouvez voir comment cela fonctionne ici: https://www.drupal.org/docs/8/api/routing-system/altering-existing-routes-and-adding-new-routes-based- on-dynamic-ones

Le RouteSubscriber ressemblerait à ceci:

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

Les noms de route sont tirés du module utilisateur principal. Dans "setRequirement", vous pouvez faire tout ce que vous pouvez faire dans la configuration de route normale. Notez que setRequirement ajoute une autorisation (ou un rôle, etc.), mais l'exigence ["_entity_access"] => "user.update" fait également toujours partie de l'itinéraire.

Ensuite, vous devez enregistrer le service dans le fichier yaml de service de votre module:

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

Au lieu de créer un module pour cela, vous pouvez simplement créer une règle.

Voici un guide pratique:

étape 1: créer une règle qui agit sur cet événement: "La page du compte utilisateur est affichée"

étape 2: définir une condition, quelque chose comme: "NON L'utilisateur a des rôles Paramètre: Utilisateur: [compte], Rôles: administrateur"

étape 3: créer une action: "Paramètre de redirection de page: URL: toboggan/refusé" (dans le cas où vous utilisez la connexion toboggan mais n'importe quelle URL de page devrait fonctionner ici afin que vous puissiez créer une page spécialement pour cela en disant quelque chose comme: "Nous sommes désolé mais pour le moment vous ne pouvez pas accéder à votre page de profil. "

étape 4: activez cette règle par exemple au cas où vous souhaiteriez obtenir la dernière version de votre site de production, téléchargez une sauvegarde sql, tripotez-la localement puis assurez-vous de la télécharger à nouveau sans décevoir les utilisateurs qui pourraient vouloir mettre à jour leur profil dans l'intervalle.

en outre, vous pouvez également ajouter une autre condition pour vérifier si l'utilisateur affiche la page de profil d'un autre utilisateur ou la sienne afin que vous établissiez deux règles différentes, l'une qui affiche une page indiquant qu'il ne peut temporairement pas mettre à jour son profil et une autre règle qui affiche un page indiquant pourquoi ils ne peuvent pas afficher le profil d'un utilisateur particulier.

J'ai testé cela et ajouté cette condition: "Paramètre de comparaison de données: Données à comparer: [compte], Valeur des données: [site: utilisateur actuel]" Ce que cela fait, c'est seulement refuser l'accès pour afficher leur propre compte, puis afficher le page correcte que vous avez créée pour cet accès refusé. Je pense que cela a plus de sens.

0
BassPlaya