acl9: определить авторизацию заранее - PullRequest
1 голос
/ 21 декабря 2009

Я использую acl9 поверх authlogic в одном из моих проектов. Мне нравится подход acl9, но я думаю, что пытаюсь сделать что-то, что не так просто (не сказать невозможно).

Из соображений удобства использования я хотел бы иметь встроенную панель администратора. Например, скажем, я получил аукцион ресурсов и аукцион / заявку с вложенными ресурсами. Когда обычный пользователь участвует в аукционах / 1 (1 = id), он должен видеть «обычный» материал (описание, цена ...), привилегированный пользователь на том же сайте должен иметь дополнительные ссылки для редактирования аукциона (= аукционы / 1 / редактировать). И вот тут начинается самое интересное.

Возможно, я не выглядел достаточно близко или не в тех местах, но я не мог найти способ определить, авторизован ли мой текущий пользователь для действия редактирования. Очевидно, я мог бы показать ссылку всем и позволить действию редактирования отклонить обычного пользователя, но это нереальный вариант. Что меня здесь беспокоит, так это то, что информация уже находится в системе (см. Блок access_control ниже), и я не могу найти способ ее использовать. Это не СУХОЙ на многих уровнях.

 access_control do
  allow :privileged, :to => [:index, :show, :edit, :update]
  allow anonymous, :to => [:new, :show, :create]
 end

Становится еще хуже, если я хочу определить, какие права имеет пользователь на auctions/1/bids/2/edit, потому что это совершенно другой контроллер.

Как я могу получить доступ к этой информации заранее и затем решить, следует ли вообще отображать ссылку для редактирования? Это просто невозможно (без изменения самого acl9) или я не выглядел достаточно жестко? Существуют ли плагины авторизации, которые лучше соответствуют моим требованиям?

1 Ответ

1 голос
/ 24 декабря 2009

что вы подразумеваете под доступом к нему "заранее"? Вы хотите визуализировать разные шаблоны для разных пользователей или просто использовать в шаблоне условные выражения, чтобы скрыть / показать его части в зависимости от уровней доступа пользователя? Я считаю, что это должно быть так просто, как иметь что-то вроде этого в коде или шаблоне:

if current_user.has_role?(:privileged)  
  # here goes the stuff that should be displayed to privileged user only  
end

Если вам нужен доступ к определенному набору правил в шаблоне (например, «разрешил ли я этому пользователю доступ к действию редактирования?»), Вы не можете сделать это с помощью acl9. И я считаю, что вы все равно не должны этого делать, так как нехорошо связывать свою бизнес-логику и контроль аутентификации с вашим контроллером - если вы решите переименовать контроллер завтра, ваша логика с ошибкой. Но он может видеть два пути решения.

  1. Разделите свои роли на более подробные. Например, разделите «Привилегированный» на «Редактор», «Создатель», «Удалить» и т. Д. Таким образом, вы можете создать свои правила доступа с этими меньшими правилами и использовать их в шаблоне для точного контроля.

  2. Проверка ролей делегатов для ваших объектов. Именно так я обычно делаю это в своих проектах, поскольку он позволяет работать только с глобальными ролями и позволяет моделям решать, разрешено ли пользователю что-то делать с ними - например, if @auction.allows_edit_for?(current_user) {}. Для acl9 требуется несколько переопределений, я уже писал об этом методе здесь некоторое время назад.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...