2013-04-19 3 views
4

Привет, я использую rollify и только что понял, что я на самом деле не воспользовался его полным потенциалом.Какова цель Rolify?

В настоящее время я делаю вещи в мой контроллер, как повторно маршрутизации пользователей, если current_user.has_role? :whatever_role, и позволяет пользователям, если они имеют любые другие роли ...

Кто-то задал вопрос о StackOverflow о rolify и когда я получил пытаясь ответить на него, я понял, что делаю это неправильно.

Теперь, вот где начинается моя путаница ... Внутри ability.rb у меня есть:

user ||= User.new # guest user (not logged in) 
if user.has_role? :consumer 
    can :manage, Review 
else 
    can :read, Review 
end 

Теперь предположим, что я добавляю потребителя роль пользователя:

x=User.last 
x.add_role :consumer 
# => #<Role id: 10, name: "consumer", resource_id: nil, resource_type: nil, created_at: "2013-04-18 23:00:46", updated_at: "2013-04-18 23:00:46"> 

права , поэтому роль создается. Я могу это проверить, выполнив:

x.has_role? :consumer 
=> true 

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

x.has_role? :consumer, Review 
=> true 

, но не для других моделей ... здесь я пытаюсь продукты

x.has_role? :consumer, Product 
=> true 

Далее, когда я смотрю «запрос ролей ресурсов» и пытаюсь запросить прикладные роли для обзоров, я не нахожу приложенных ролей:

Review.first.applied_roles 
=> [] 

Может кто-нибудь объяснить, пожалуйста, объясните мне. Благодаря

+0

Мне нравится reddit как источник вопросов, но я ** люблю ** stackoverflow, являющийся ** авторитетным источником ** ответов. Поэтому я поставил вопрос о том, что все могут быть проще, раньше; и [отправил мой ответ на reddit] (http://www.reddit.com/r/rails/comments/1cn4ra/can_someone_please_explain_the_abilityrb_file/c9i7s55). Если мой ответ не будет рассмотрен как благоприятный для него в reddit, я свяжусь с любым лучшим ответом в ответе здесь, а затем закрою это. В противном случае, я хотел бы, чтобы на его вопрос также был дан ответ, который я затем перейду к reddit. –

ответ

27

Мой ответ, гарнир вопрос от this reddit post:

Authentication учреждает User, кто они утверждают.

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

Роли лишь общие закономерности авторизации через пользователь: это User может быть разрешен как таковой, что User может быть разрешен как это вместо.

Этот ингредиент отсутствует здесь Разрешения: взаимосвязь между установленным Role и некоторым действием контроллера.

Roles сами не делают никаких обещаний о том, какое действие может выполнить User. И помните - авторизация - все о действиях. Roles Обобщай, что ты делаешь с User. Они существуют, чтобы у вас не было необходимости запрашивать каждые User для гигантского списка стилей Permissions.Они заявляют: это User является Role! Конечно, у них есть Permission, чтобы сделать это!

Существует много типов Permission. Вы можете хранить их в базе данных, если вы хотите, чтобы ваш достаточно разрешилUsers, чтобы иметь возможность редактировать их, а также ваш Roles, если они тоже должны быть настроены. Или, если ваш User'sRoles достаточно статичны, вы можете управлять Permissions заранее с Ruby, код:

  • Когда я хочу, чтобы иметь конфигурируемый Roles и Permissions, то есть для клиентского приложения вы переключени с кем-то завершение контракта, я реализую User :has_many Roles и Role :has_many Permissions с моими собственными моделями, а затем добавлю крючок before_filter :authorize в свой ApplicationController и напишу на него метод authorize, который знает, как уклониться от этих ожиданий, или отобразить страницу 403 для этих людей которые настаивают на том, чтобы вручную вводить URL-адреса на вещи, которые они надеются выставить actions к вещам, к которым они не должны иметь доступа.

  • Когда я хочу просто настроить Roles, я использую Ryan Bates' CanCan gem.

  • Когда я хочу предопределил Roles и Permissions, я использую Rolify в сочетании с Nathan Long's Authority, чтобы получить восхитительно гибкий класс на основе Permissions с помощью классов доверителя.

Оба Roles и Permissions могут быть либо класса на основе или на основе экземпляров, в зависимости от вашего сценария использования. Вы можете, скажем, с способностями rolify, которые вы только что обнаружили, решили, что Users может действовать только как Role в определенных обстоятельствах, основанных на экземплярах. Или, общий Roles of User может выполнять только действие с учетом объекта, который они пытаются сделать Действие имеет определенный тип.

Чтобы исследовать перестановку из них, предполагая применение блога, следуя формуле

User, который является/Roleclass/instance может action а/AN/все/любой/что (class/instance) Permission:

  • Role класс и Permission класс:

    User который является Admin может delete любой Post.

  • Role класса и Permission экземпляр:

    User, который является Admin может edit все Posts that they approved to be published

    Это было бы проще, если бы опубликовано сообщения имело approved_by поля, указывающее на User идентификатор. (Используйте state machinegem для такого рода ситуации

  • Role экземпляра и Permission класс:.

    User, который an Author of a Post может comment на любой Post

    Обратите внимание, что такая ситуация встречается редко, что почему нет таких драгоценных камней, о которых я упомянул выше, чтобы справиться с этой ситуацией, за исключением, возможно, способности управлять предопределенными обстоятельствами, такими как Rolify и Authority, или, если вы должны принять это решение на свой cl ient, ваше собственное решение.

  • Role экземпляра и Permission экземпляра:

    User кто an Author of a Post может edit что Post.

TL; DR:

  • Rolify только для ролей: группировка Users по Permission: доступ к действию контроллера. Вам еще предстоит решить, как вы собираетесь управлять Permissions.

Я надеюсь, что это помогает ваше понимание позиции Rolify «s в великой схеме аутентификации и авторизации!

+0

О, я понял! Хорошая работа. – Abram

+0

Итак, если «Rolify просто для ролей» - в чем смысл его использования? Я использую Devise + CanCanCan и определяю вручную в user.rb 'def admin? admin end', то в способности.rb: 'if user.admin? может: управлять,: все else can: read,: all' – prograils

+1

@prograils Это зависит от того, как вы хотите написать свой код авторизации (в основном это просто проверка подлинности). CanCanCan является библиотекой разрешений и хорошо сочетается с Rolify. Вы должны спросить себя, откуда приходит метод 'user.admin? '. Во-первых, это может быть просто логическим атрибутом для пользователя. По мере того, как вы перерастаете в систему не-двоичных ролей, вы получите массу булевых флагов на модели. Если у пользователя может быть много ролей, ваши проверки могут быстро усложниться. Rolify позволил бы стать 'user.has_role?: admin' и обрабатывать развивающуюся сложность чисто. –

Смежные вопросы