ユーザーが自分のプロファイルを編集または表示できないようにする


7

表示と編集のためにユーザーのプロファイルへのアクセスを無効にする最良の方法は何ですか?基本的に、ユーザーはアカウントを作成できますが、自分または他のユーザーのプロファイルを編集または表示することはできません。

回答:


11

これをカスタムモジュールに追加します。

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

これにより、ユーザープロファイルビューが[ユーザープロファイルの表示]権限の下に置かれ、[ユーザーの管理]の下で編集されます。


どうもありがとう!御馳走を働いた。私はhook_menuでこれを実行しようと思ったが、それが間違った場所にあり、hook_menu_alter
space_ballsにある

単に素晴らしい。私はこれのために貢献したモジュールを探していました。しかし、この答えは最低限のコード行で仕事をしました。
生徒の

7

質問はDrupal 7に固有のものではないようなので、Drupal 8でこれを行う方法を次に示します。hook_menu_alterは不要になり、RouteSubscriberを使用します。これがどのように機能するかは、https//www.drupal.org/docs/8/api/routing-system/altering-existing-routes-and-adding-new-routes-based-on-dynamic-onesで確認できます

RouteSubscriberは次のようになります。

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

ルート名はコアユーザーモジュールから取得されます。「setRequirement」では、通常のルート構成で実行できるすべてのことを実行できます。setRequirementは権限(またはロールなど)を追加しますが、["_ entity_access"] => "user.update"要件もルートの一部であることに注意してください。

次に、モジュールのサービスyamlファイルにサービスを登録する必要があります。

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

0

そのためのモジュールを作成する代わりに、単純にルールを作成できます。

方法は次のとおりです。

ステップ1:このイベントで動作するルールを作成する:「ユーザーアカウントページが表示されます」

ステップ2:次のような条件を設定します:「NOTユーザーはロールを持っていますパラメーター:ユーザー:[アカウント]、ロール:管理者」

ステップ3:アクションを作成する:「ページリダイレクトパラメーター:URL:toboggan / denied」(ログインtobogganを使用しているが、どのページURLもここで機能する必要があるため、特に次のようなことを言っているページを作成できます:申し訳ありませんが、現時点ではプロフィールページにアクセスできません。」

ステップ4:たとえば、本番サイトの最新バージョンを取得したい場合にこのルールをアクティブにし、SQLバックアップをダウンロードし、ローカルでいじってから、更新したいユーザーをがっかりさせずにもう一度アップロードしてください。その間の彼らのプロフィール。

さらに、別の条件を追加して、ユーザーが別のユーザーのプロフィールページまたは自分のプロフィールページを表示しているかどうかを確認して、2つの異なるルールを作成できます。1つは一時的にプロフィールを更新できないことを示すページを表示し、もう1つは特定のユーザーのプロファイルを表示できない理由を示すページ。

私はこれをテストし、この条件を追加しました:「データ比較パラメーター:比較するデータ:[アカウント]、データ値:[サイト:現在のユーザー]」これは、自分のアカウントを表示するためのアクセスを拒否し、この拒否されたアクセス用に作成した正しいページ。これはもっと理にかなっていると思います。


ルールの力を使うことに常に興奮しています。ただし、ユーザーが編集ページ/ user / nn / editへの直接URLを持っている場合、これは機能しませんでした。ただし、ユーザーが/ userページにアクセスすることはできません。
トニー

よく見つかりました。URLが文字列user / *であるかどうかをチェックする条件をもう1つ追加できれば、保存されます。[account:edit-url]と[site:current-user:edit-url]を比較するテキスト比較で試してみましたが、うまくいきませんでした。「パスにURLエイリアスがある」[site:current-user:edit-url]条件もありませんでした。探し続けます。
BassPlaya 14

私はそれを理解することができず、受け入れられた回答からのコードがうまく機能したので、あきらめました。
Tony
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.