表示と編集のためにユーザーのプロファイルへのアクセスを無効にする最良の方法は何ですか?基本的に、ユーザーはアカウントを作成できますが、自分または他のユーザーのプロファイルを編集または表示することはできません。
表示と編集のためにユーザーのプロファイルへのアクセスを無効にする最良の方法は何ですか?基本的に、ユーザーはアカウントを作成できますが、自分または他のユーザーのプロファイルを編集または表示することはできません。
回答:
これをカスタムモジュールに追加します。
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';
}
これにより、ユーザープロファイルビューが[ユーザープロファイルの表示]権限の下に置かれ、[ユーザーの管理]の下で編集されます。
質問は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 }
そのためのモジュールを作成する代わりに、単純にルールを作成できます。
方法は次のとおりです。
ステップ1:このイベントで動作するルールを作成する:「ユーザーアカウントページが表示されます」
ステップ2:次のような条件を設定します:「NOTユーザーはロールを持っていますパラメーター:ユーザー:[アカウント]、ロール:管理者」
ステップ3:アクションを作成する:「ページリダイレクトパラメーター:URL:toboggan / denied」(ログインtobogganを使用しているが、どのページURLもここで機能する必要があるため、特に次のようなことを言っているページを作成できます:申し訳ありませんが、現時点ではプロフィールページにアクセスできません。」
ステップ4:たとえば、本番サイトの最新バージョンを取得したい場合にこのルールをアクティブにし、SQLバックアップをダウンロードし、ローカルでいじってから、更新したいユーザーをがっかりさせずにもう一度アップロードしてください。その間の彼らのプロフィール。
さらに、別の条件を追加して、ユーザーが別のユーザーのプロフィールページまたは自分のプロフィールページを表示しているかどうかを確認して、2つの異なるルールを作成できます。1つは一時的にプロフィールを更新できないことを示すページを表示し、もう1つは特定のユーザーのプロファイルを表示できない理由を示すページ。
私はこれをテストし、この条件を追加しました:「データ比較パラメーター:比較するデータ:[アカウント]、データ値:[サイト:現在のユーザー]」これは、自分のアカウントを表示するためのアクセスを拒否し、この拒否されたアクセス用に作成した正しいページ。これはもっと理にかなっていると思います。