ya_acl
Ya_Acl - реализация списка прав доступа (ACL).
Ya_Acl представляет собой самостоятельный объект посредством которого производятся все проверки. Это значит что он не привязан к фреймворкам и это руководство предлагает только один из возможных путей использования этого компонента.
Установка
gem install ya_acl
Основные понятия
Ресурс - объект, доступ к которому контролируется. Привилегия - действие совершаемое над ресурсом. Роль - объект, который может запрашивать доступ к ресурсу.
Роль(роли) запрашивает доступ к привилегии ресурса. Например ресурс “пользователь” может иметь привилегию “создать”.
Начальные условия
-
По умолчанию все запрещено. И по ходу можно только выставлять разрешения, но не запреты.
-
Все ресурсы должны быть добавлены в acl (в противном случае получите исключение).
Основные возможности
Assert - динамические проверки, например, является ли залогиненый пользователь владельцем этого объекта. Проверки могут ставиться на конкретные роли для текущей привилегии, а не просто “на привилегию”. Владение несколькими ролями. Если хотя бы одной из ролей пользователя разрешен доступ к привилегии ресурса, то доступ открыт. Роль с глобальным доступом ко всем ресурсам. Передается аргументом в метод билдера “resources”. Наследование ролей для ресурсов. То есть мы можем определить роли которым автоматически станут доступны все привилегии ресурса.
Порядок выполнения проверок на доступность к привилегии ресурса
-
Если ни одна из переданных ролей не имеет доступа к привилегии ресурса, то доступ запрещается.
-
Для каждой роли, имеющий доступ к привилегии, проверяются проверки предназначенные для этой роли. Если хотя бы для одной роли прошли все проверки, то доступ разрешается.
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 или бросает исключение