Модуль Views: Как ограничить доступ пользователя

8

Я использую модуль Представления, чтобы создать представление, к которому могут иметь доступ только определенные пользователи. Я знаю, что Views включает в себя управление доступом по роли или разрешениям, но мне нужно нечто более детальное: в основном, я хочу иметь возможность сказать, что только пользователь "x" и пользователь "y" могут получить доступ к определенному представлению (или кому-то другому с роль администратора сайта). Так что это будет работать очень похоже на то, как действует модуль ACL для отдельных узлов.

Является ли лучший подход для создания плагина доступа пользовательских представлений? У меня нет большого опыта с этим.

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

Любые идеи? Или я делаю это сложнее, чем нужно?

Спасибо Бен

Benk
источник
Возможно, вам придется написать плагин для доступа к представлениям, но если бы вы могли обновить свой вопрос немного подробнее, то, возможно, вы могли бы добиться этого другим способом. Что делает представление / отображает? Каким пользователям разрешено его просматривать? У пользователей разные роли? Есть ли у пользователей определенное поле или что-то связанное с ними, которое позволяет им получить к нему доступ?
Джейми Холлерн
Джейми, спасибо за ответ. На самом деле, я также использую Drupal Commerce для создания уникального интернет-магазина. В качестве вкладки на каждом узле продукта (в дополнение к вкладкам «Просмотр» и «Изменить») я хочу создать дополнительную вкладку под названием «Заказы», ​​которая будет представлением, отображающим все заказы, включающие этот конкретный продукт. Поставщик конкретного продукта - это пользователь, которому я хочу видеть представление «Заказы» для этого продукта.
BenK
Таким образом, поставщик может отслеживать продажи своего продукта на постоянной основе. Но я не хочу предоставлять доступ каждому с ролью «поставщика», потому что тогда любой поставщик сможет просматривать продажи продуктов других поставщиков. Есть смысл? ;-)
BenK

Ответы:

5

Вместо ограничения разрешений в представлении вы можете ограничить разрешения для элемента меню, который ведет к этому представлению (будь то вкладка на узле или обратный вызов меню). Вы можете создать свой вид только с отображением «По умолчанию» и без отображения страницы (поэтому пользователи не могут просто определить путь к нему). Затем в вашем page callbackпункте меню просто позвоните, views_embed_viewчтобы отобразить вид. Кажется, что обработка разрешений для пункта меню может быть проще, чем написание нового плагина для Views (хотя плагин может быть полезен для других).

Chaulky
источник
Спасибо за предложение! В итоге я следовал этому общему подходу (который также был предложен Бердиром), но создал поле ссылки пользователя на каждом узле с именем field_usercanaccess. Я был в состоянии использовать hook_menu () и определить обратный вызов доступа, который убедился, что текущий пользователь соответствует пользователю, указанному в поле. В противном случае вкладка (и вид) не будет отображаться. Это работает отлично! :-)
BenK
@BenK потрясающе! Я рад, что у тебя что-то работает. В качестве части помощи, которую вы сделаете Drupal Questions, вы также должны проголосовать за ответы (или вопросы), которые вы считаете полезными. Так что, вероятно, вам следует проголосовать за ответ @ Berdir (и мой, но это не я, пытающийся получить голоса, он пытается сделать сайт Drupal
Answer
Спасибо. :-) Я новичок в Stack Exchange и у меня всего 13 очков. Когда я пытаюсь голосовать, он говорит, что мне нужно 15 очков, чтобы проголосовать. Поэтому, если у кого-то есть два лишних балла (или я могу заработать их другим способом), я бы определенно проголосовал за ответы и вопросы. --Ben
BenK
@BenK о да, я забыл о 15-балльной шкале. Вы всегда можете попробовать ответить на вопросы ... одно возражение на ваш ответ получает 10 повторений.
Чолки
6

Попробуйте модуль обратного вызова Views Access .

Предоставляет основанный на обратном вызове контроль доступа для Представлений.

Доступные функции обратного вызова определяются модулями, использующими hook_views_access_callbacks()функцию (так же, как в hook_perm()), а затем могут быть установлены в конфигурации представления «Ограничения доступа».

user5318
источник
Использование view access callback прекрасно работает, за исключением странной фатальной ошибки. Смотрите здесь: drupal.stackexchange.com/questions/3336/… . Вроде как путь - но как это исправить?
Druvision
2

Должно быть, я что-то упустил, но похоже, что вы создадите новую роль и добавите этих пользователей. Затем воспользуйтесь функцией View: Access: Role.

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

Если вы только скрываете пункт меню, мне кажется, что представление все еще будет работать, и пользователь может настроить URI для просмотра данных.

Джерри

Джерри
источник
1

Как насчет использования модуля « Пользовательские разрешения » для создания некоторых новых разрешений специально для ваших целей, а затем с помощью модуля « Пользовательские разрешения » для назначения этих новых разрешений отдельным пользователям?

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

Том Киркпатрик
источник
Это интересное предложение использовать пользовательские разрешения. Я не видел этот модуль, так как он стал шире, чем просто разрешения конфигурации сайта. Единственное осложнение в том, что я делаю все это в Drupal 7 (и пока нет официальной ветки). Но если бы я мог заставить это работать, возможно, было бы возможно указать разрешение в управлении доступом к представлению непосредственно (без необходимости модуля Полномочий пользователя). Спасибо за предложение! :-)
BenK
Я попробую это и доложу.
BenK
0

Да, это имеет больше смысла. Я думаю, что вы могли бы (возможно, не на 100% уверен) использовать View и аргумент. Установите в качестве аргумента идентификатор пользователя, полученный от текущего пользователя, вошедшего в систему, и в качестве аргумента по умолчанию ничего не отображается. Это должно быть в состоянии сделать это, хотя я не знаю, насколько безопасным было бы быть справедливым. Если вы попробуете, отправьте сообщение и дайте мне знать о ваших успехах.

Джейми Холлерн
источник
Да, я попробую и доложу. Я также пробую плагин доступа к представлениям с аргументом, так что посмотрим, как оно пойдет. Спасибо.
BenK
0

Если вы хотите объединить различные плагины доступа в Views, вы можете взглянуть на модуль Views access many .

Стивен Джонс
источник