web-dev-qa-db-ja.com

Drupal 8でログインユーザーのエンティティへのアクセスを確認します

独自のエンティティを持つプロジェクトの1つにプライベートメッセージモジュールを追加しました。ユーザーがそのエンティティコンテンツにアクセスできるかどうかを確認する必要があります。モジュールには、モジュールのrouting.ymlで定義されたメニュー項目があります

例えば。:

entity.private_message_thread.canonical:
  path: '/private_messages/{private_message_thread}'
  defaults:
    _entity_view: 'private_message_thread'
    _title: 'Private Messages'
  requirements:
    _entity_access: 'private_message_thread.view'

ユーザーが上記のメニューパスへの表示アクセス権を持っているかどうかを確認するにはどうすればよいですか?

1
Nitin Shirole

エンティティアクセスと$ entity-> access( 'view'、$ account);をテストしました。それは私の場合にはうまくいきました。以前にオプションの$ accountパラメーターを使用して、現在ログインしているユーザーを確認できるようにしました。

私はエンティティをロードしました:

$entity_manager = \Drupal::entityTypeManager();
$thread_entity = $entity_manager->getStorage('private_message_thread')->load('private_message_thread_id');

ユーザーがコードでエンティティを表示する権限を持っているかどうかを確認したいと思いました。以下は、私の場合と同じコードです。

$account = \Drupal::currentUser();
$entity_manager = \Drupal::entityTypeManager();
$entity = $entity_manager->getStorage('private_message_thread')->load('private_message_thread_id');
$check = $entity->access('view', $account);

同じことでもっと良い答えがあったら教えてください。

2
Nitin Shirole

これらのエンティティの注釈をチェックして、アクセスハンドラを見つけることができます。

例えば.

/**
 * Defines the Private Message Thread entity.
 *
 * @ContentEntityType(
 *   id = "private_message_thread",
 *   label = @Translation("Private Message Thread"),
 *   handlers = {
 *     "view_builder" = "Drupal\private_message\Entity\Builder\PrivateMessageThreadViewBuilder",
 *     "views_data" = "Drupal\views\EntityViewsData",
 *     "access" = "Drupal\private_message\Entity\Access\PrivateMessageThreadAccessControlHandler",
 ...

ご覧のとおり、アクセスハンドラがあります。今、あなたはそれがどのように機能するかを知っています。

  protected function checkAccess(EntityInterface $entity, $operation, AccountInterface $account) {
    if ($account->hasPermission('use private messaging system')) {
      switch ($operation) {
        case 'view':
          if ($entity->isMember($account->id())) {
            $messages = $entity->filterUserDeletedMessages($account);
            if (count($messages)) {
              return AccessResult::allowed();
            }
          }
          ...
2
Alex Kuzava