Rails конфигурируемая авторизация для каждой роли / действия - PullRequest
1 голос
/ 24 октября 2011

Я работаю с приложением Rails 2.3, которое уже использует декларативное_авторизация для обработки пользовательских разрешений.Каждый пользователь принадлежит к одной группе (без причудливых ролей) с правами доступа к определенным моделям, в основном с обычными действиями CRUD, но с несколькими специальными.Все это прекрасно работает с декларативным_авторизацией в обычном стандартном режиме.

Теперь мы хотим разрешить администраторам устанавливать разрешения для определенных групп пользователей в зависимости от типов моделей.Например, мы создаем новую группу Foo, назначаем ей несколько пользователей, а затем определяем с помощью флажков, могут ли пользователи в группе Foo c / r / u / d объекты модели Bar.

Я использовал acl9раньше, и я думаю, что вижу, как я мог бы сделать эту работу.В последнее время я был фанатом CanCan, но я не не понимаю, как легко с этим справиться.Если методативная декларация может сделать это, я буду придерживаться этого, но я готов укусить пулю и переключиться.

Какой плагин был бы лучшим способом сделать это?Есть ли способ получить декларативное_авторизацию, чтобы сделать работу?Элегантный способ использования CanCan?Есть ли какие-то ошибки, за которыми я должен следить, например, за производительностью базы данных?

Я могу быть уверен, что обновлю приложение до Rails 3.1, но я бы предпочел найти совместимое с 2.3 решение.

Я видел несколько похожих вопросов, но не получил удовлетворительных ответов Модуль Rails для динамической авторизации на основе ролей?

и это для cancan https://github.com/ryanb/cancan/wiki/Role-Based-Authorization

1 Ответ

0 голосов
/ 24 октября 2011

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

Не так много документации, но идея такова:

a_user_object.may_read?(object)

Если object является экземпляром Todo, то Stonewall будет смотреть внутри модели Todo и исполнять блок read

# app/models/todo.rb

stonewall do |s|

    s.action :read do |todo, user|
      todo.owner == user  # only the owner of a todo item may read the item
    end
end

Этот подход упрощает две вещи:

  1. read - это просто блок Ruby, поэтому все, что вы хотите, может произойти
  2. действия могутполучить произвольные имена, поэтому, если вы хотите проверить, есть ли у пользователя разрешение комментировать элемент todo (например), просто создайте s.action :comment и получите к нему доступ с помощью a_user_object.may_comment?(object)
...