ya_acl

Ya_Acl - реализация списка прав доступа (ACL).

Ya_Acl представляет собой самостоятельный объект посредством которого производятся все проверки. Это значит что он не привязан к фреймворкам и это руководство предлагает только один из возможных путей использования этого компонента.

Установка

gem install ya_acl

Основные понятия

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

Роль(роли) запрашивает доступ к привилегии ресурса. Например ресурс “пользователь” может иметь привилегию “создать”.

Начальные условия

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

  • Все ресурсы должны быть добавлены в acl (в противном случае получите исключение).

Основные возможности

Assert - динамические проверки, например, является ли залогиненый пользователь владельцем этого объекта. Проверки могут ставиться на конкретные роли для текущей привилегии, а не просто “на привилегию”. Владение несколькими ролями. Если хотя бы одной из ролей пользователя разрешен доступ к привилегии ресурса, то доступ открыт. Роль с глобальным доступом ко всем ресурсам. Передается аргументом в метод билдера “resources”. Наследование ролей для ресурсов. То есть мы можем определить роли которым автоматически станут доступны все привилегии ресурса.

Порядок выполнения проверок на доступность к привилегии ресурса

  1. Если ни одна из переданных ролей не имеет доступа к привилегии ресурса, то доступ запрещается.

  2. Для каждой роли, имеющий доступ к привилегии, проверяются проверки предназначенные для этой роли. Если хотя бы для одной роли прошли все проверки, то доступ разрешается.

Workflow

В начале необходимо проинициализировать объект acl. Для этого необходимо создать файл (структура ниже) который будет загружаться при старте приложения. Хотя в development среде вы можете захотеть подгружать его при каждом запросе для удобства разработки.

YaAcl::Builder.build do
  roles do # Роли
    role :admin
    role :editor
    role :operator
  end

  asserts do # Проверки
    assert :assert_name, [:current_user_id, :another_user_id] do
      current_user_id == another_user_id
    end

    assert :another_assert_name, [:current_user_id, :another_user_id] do
      current_user_id != another_user_id
    end
  end

  resources :admin do # Ресурсы и роль которой доступно все
    resource 'UserController', [:editor] do # Ресурс и роли которым доступны все привилегии данного ресурса
      privilege :index, [:operator] # доступно для :admin, :editor, :operator
      privilege :edit # доступно для :admin, :editor
      privilege :new do
        assert :assert_name, [:editor] # Эта проверка будет вызвана только для роли :editor
        assert :another_assert_name # Эта проверка будет вызвана для ролей :admin, :editor
      end
    end
  end
end

После этого будет доступен объект acl через YaAcl::Acl.instance.

acl = YaAcl::Acl.instance

acl.allow?('UserController', :index, [:editor, :opeartor]) # true
acl.allow?('UserController', :edit, [:editor, :opeartor]) # true
acl.allow?('UserController', :edit, [:opeartor]) # false
acl.allow?('UserController', :new, [:admin], :current_user_id => 1, :another_user_id => 1) # true
acl.allow?('UserController', :new, [:editor], :current_user_id => 1, :another_user_id => 2) # false

acl#check - возвращает объект результата YaAcl::Result
acl#check! - возвращает true или бросает исключение