Рельсы управляют канканканами

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

Я также использую cancancan в других частях моего приложения rails для управления доступом и разрешениями.

Кому-нибудь удалось использовать cancancan в рамках администрирования, чтобы панель администратора могла использовать возможности, определенные в cancancan, отображать ресурсы и применять те же разрешения?

Спасибо

0 ответов

Вы можете найти некоторую информацию о том, что нужно сделать здесь: https://administrate-prototype.herokuapp.com/authorization

То, что там упомянуто, хорошо работает для фильтрации коллекций записей, но прерывается при попытке авторизации отдельных ресурсов. Решение состоит в том, чтобы переопределить метод find_resource. Вот окончательный рабочий код:

# app/controllers/admin/application_controller.rb

rescue_from CanCan::AccessDenied do |exception|
  flash[:notice] = "Access Denied"
  redirect_to admin_root_path
end

# Override find_resource, because it initially calls scoped_resource.find(param)
# which breaks since we are overriding that method as well.
def find_resource(param)
  resource_class.default_scoped.find(param)
end

# Limit the scope of the given resource
def scoped_resource
  super.accessible_by(current_ability)
end

# Raise an exception if the user is not permitted to access this resource
def authorize_resource(resource)
  raise CanCan::AccessDenied unless show_action?(params[:action], resource)
end

# Hide links to actions if the user is not allowed to do them      
def show_action?(action, resource)
  # translate :show action to :read for cancan
  if ["show", :show].include?(action)
    action = :read
  end
  can? action, resource
end

Это поможет вам начать базовую авторизацию ресурсов с CanCan, Может потребоваться дополнительная настройка представлений полей, если вам необходимо ограничить доступ к вложенным ресурсам и т. Д. Но с этого момента это должно быть довольно стандартным. Надеюсь это поможет.:)

Другие вопросы по тегам