Как ограничить прямой доступ к узлам?

12

Как ограничить прямой доступ к узлам, но просто разрешить представлениям получать доступ к обязательному полю определенного типа узла?

Например, в представлении «Слайд-шоу» мы перемещаем поле изображения, которое принадлежит конкретному типу узла. Но мы не хотим, чтобы поисковые системы получали доступ, а посетители получали доступ к узлам, принадлежащим к этому типу узлов.

Какие-либо предложения?

Фахад Ур Рехман
источник

Ответы:

12

Простым решением было бы не публиковать узлы, которые вы не хотите быть доступными. Представления могут по-прежнему извлекать данные из этих узлов.

googletorp
источник
1
Слишком просто? Нет такого понятия, как «слишком простое решение». Сложность не является самоцелью, не так ли? Возможно, ответ Googletorp не решит вашу конкретную проблему, но в этом случае вам придется быть более сложным и объяснить, почему нет.
Marcvangend
@marcvangend Хотя уже поздно, но я понимаю, что это не ответ на мой вопрос. Надеюсь, что кто-то может добавить лучший ответ
Фахад Ур Рехман
@Fahad Чтобы получить лучшие ответы, вам нужно задавать лучшие вопросы. Ответ Googletorp выглядит как хорошее решение для меня, и, похоже, согласны. Если это не решит вашу проблему, зайдите и отредактируйте свой вопрос, добавив все необходимые детали.
Marcvangend
@marcvangend фактически моя проблема была решена, и я принял ответ раньше, но в свете вашего комментария. Googletorps имеет очень высокую репутацию, не получает никакой разницы, если я принимаю или не принимаю его ответ. Он предоставил отличное альтернативное решение, за которое я также проголосовал за него.
Фахад Ур Рехман
@Fahad Приняв ответ, вы говорите: этот ответ решил мою проблему. Это мощное утверждение, которое очень полезно для посетителей, чтобы узнать, полезен ответ или нет. Если мой ответ не решил вашу проблему, то вы должны отредактировать свой вопрос и опубликовать некоторые подробности о том, почему мое решение не работает для вас, и, как сказал marcvangend, добавьте больше деталей.
googletorp
3

Если мы отменим публикацию узлов, добавленных user1, они не будут редактироваться любым другим пользователем, даже если у пользователя есть права на редактирование содержимого этого типа содержимого.

Ограничение просмотра страницы узла представляется лучшим способом ограничения прямого доступа к любым узлам определенного типа контента.

Использование также довольно просто, вам просто нужно включить этот модуль и настроить разрешения для узлов, которые напрямую доступны как обычно.

http://drupal.org/project/restrict_node_page_view

Со страницы проекта:

Вы когда-нибудь использовали тип узла слайд-шоу, который нужно опубликовать, но не хотите, чтобы узел был доступен сам по себе, используя путь узла / XXX? Этот модуль для вас!

С помощью этого модуля вы можете отключить прямой доступ к страницам узлов (node ​​/ XXX) на основе типов узлов и разрешений.

Включите модуль и не забудьте настроить свои разрешения.

Фахад Ур Рехман
источник
1

Другой модуль, который делает то же самое, но с большим количеством функций.

Кроличья нора

Сопровождающие этого проекта просят "Ограничить просмотр страницы узла", чтобы объединить проекты в проблемах.

Преимущества по сравнению с «Ограниченным просмотром страницы узла»:

  • Та же основная функциональность на узле, но расширяемая для пользователей / файлов / таксономических терминов
  • Может быть использован в вашем модуле
  • Может быть глобальным для типа контента или для каждого контента
  • Подробнее на странице проекта ...

Недостаток в отношении «Ограничения просмотра страницы узла»:

  • Больше кода, возможно, менее эффективно (нужны тесты, не доказано)
Payou
источник
1

Вы должны использовать node_access(), есть определенные опции, которые вы можете легко реализовать с помощью hook_node_access(). Реализация node_access()позволяет вам принять решение о том, кто может получить доступ к узлу, а кто может создавать, удалять, редактировать или обновлять такой узел. Однако представления могут по-прежнему извлекать данные из этих узлов.

hook_node_access () , node_access ()

gauravjeet
источник
0

Вдохновленный https://www.drupal.org/project/restrict_node_page_view, вы можете написать небольшой модуль самостоятельно:

/**
 * Implements hook_node_access()
 */
function MYMODULE_node_access($node, $op, $account) {

  // Default checks
  if (!is_object($node)) {
    return NODE_ACCESS_IGNORE;
  }

  $type = is_string($node) ? $node : $node->type;

  if($op == 'view' && arg(0) == 'node' && arg(1) === $node->nid) {

    // Restrict access to full MYTYPE node for anon users
    if ($type == 'MYTYPE' && user_is_anonymous()) {
      return NODE_ACCESS_DENY;
    }
  }
  // Default
  return NODE_ACCESS_IGNORE;
}
leymannx
источник
Этот модуль уже упоминался пару лет назад. Не могли бы вы объяснить, что нового ваш ответ приносит к теме?
Молот
@ Mołot - ... написать модуль самостоятельно. Отредактированный ответ.
leymannx
0

Используя модуль « Правила », вы можете реализовать правило, похожее на это:

{ "rules_check_url" : {
    "LABEL" : "Disallow node/* access",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "ON" : { "init" : [] },
    "IF" : [
      { "text_matches" : {
          "text" : [ "site:current-page:url" ],
          "match" : "node\/\\d+$",
          "operation" : "regex"
        }
      }
    ],
    "DO" : [
      { "drupal_message" : {
          "message" : "Sorry, direct access to URLs like [site:current-page:url] is not allowed around here ...",
          "type" : "error"
        }
      },
      { "redirect" : { "url" : "no_access" } }
    ]
  }
}

Приведенное выше правило (пока) не учитывает применение «действия» только для выбранных ролей (например, чтобы администраторы могли использовать эти пути для просмотра узла). Но для любого, кто немного знаком с модулем «Правила», это простое «условие», которое нужно добавить ...

Чтобы поэкспериментировать с этим правилом на своем собственном сайте, просто скопируйте весь приведенный выше код правил и вставьте его в новое правило на своем собственном сайте, созданное с помощью функции «Импорт». Затем отредактируйте / уточните, чтобы он соответствовал вашей среде (например, появится сообщение «Извините, ...»).

Pierre.Vriens
источник