Я использую адаптер авторизации Active Admin CanCan вместе с Rolify для управления авторизацией на сайте администратора. У меня есть модель company
, та has_many :manuals
, и еще одна модель, manuals
, та has_many :parts
.
Если пользователь не имеет доступа для чтения admin/manuals/1
и вводит его в адресную строку, он будет правильно перенаправлен и получит неавторизованное сообщение. Однако если пользователь введет admin/manuals/1/parts
, ему не будет отказано в доступе. Они переходят на эту страницу, но все части скрыты от них. Они должны быть перенаправлены на панель управления с несанкционированным сообщением.
Вот моя конфигурация. Заранее спасибо за любой совет, который вы можете предложить.
config/routes.rb
ActiveAdmin.routes(self)
models/ability.rb
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
can :read, ActiveAdmin::Page, :name => "Dashboard"
if user.has_role? :admin
can :manage, :all
elsif user.has_role? :moderator
can :manage, Part, :manual => { :company_id => user.company_id }
else
can :read, Part, :manual => { :company_id => user.company_id }
end
end
end
Я также перезаписал методы авторизации по умолчанию в controllers/application_controller.rb.
rescue_from CanCan::AccessDenied do |exception|
redirect_to root_url, :alert => exception.message
end
def authenticate_admin_user!
authenticate_user!
unless user_signed_in?
flash[:alert] = "You are not authorized to view this page"
redirect_to root_path
end
end
def current_admin_user #use predefined method name
return nil unless user_signed_in?
current_user
end
def after_sign_in_path_for(user)
if current_user.has_role? :admin
admin_dashboard_path
elsif current_user.has_role? :moderator
admin_manuals_path
else
company_path(user.company)
end
end
protected method authorize!
. - person Mike Vormwald   schedule 08.01.2014