Если я использую только ActiveAdmin, я знаю, что могу сделать что-то подобное, чтобы ограничить доступ определенной группы пользователей к ресурсу:
ActiveAdmin.register Resource do
menu :parent => "Super Admin Only", :if => proc { current_admin_user.super_admin? }
end
Однако, если у меня есть динамическая форма контроля доступа / разрешения, которая обновляется в зависимости от потребностей определенной группы пользователей, я должен иметь возможность обновлять свой ActiveAdmin соответственно.
Я сохраняю свои данные разрешения как json (пара ключ-значение). Сначала я думал об использовании ActiveAdmin::AuthorizationAdapter
class StaffAuthorization < ActiveAdmin::AuthorizationAdapter
def authorized?(action, subject = nil)
return true if resource.try(:name) == 'Dashboard'
return false if action == :destroy
retrieve_policy(action).authorized?
end
def role
user.role
end
def policy_klass
"policy/staff/#{role}".classify.constantize
rescue NameError
Policy::Staff::Default
end
def retrieve_policy(action)
policy_klass.new(user, resource, action)
end
end
Например, Processing
Администратор:
module Policy::Staff
class Processing < Base
def authorized?
return true if resource.try(:resource_class) == ::Borrow
return true if resource.try(:resource_class) == ::User && action == :read
return true if [ 'Reports', 'Categorize' ].include?(resource.try(:name))
false
end
end
end
Я всегда могу сгенерировать файл политики, просматривая json при сохранении, но функция выглядит грязной. Всегда в формате, возвращающем true
для определенного ресурса или действия над ним.
Есть ли лучший способ сделать такую функцию в ActiveAdmin?
Ограничения:
Запуск ActiveAdmin 1.0.0
Рюкзак 1.8.4
- Если я изменяю / обновляю любую из двух, я получаю болезненный список ошибок.