Cancan + Devise rescue_ из не пойманного исключения
Я внедряю Devise и Cancan для аутентификации пользователей и разрешений. Пока все отлично работает, за исключением того, что я не могу перенаправить пользователей на страницу входа, когда им не разрешен доступ к определенной функции.
Мой тест:
feature 'A signed in user' do
before(:each) do
user = FactoryGirl.create(:user)
visit "/login"
fill_in "user_email", :with => user.email
fill_in "user_password", :with => "ilovebananas"
click_button "Sign in"
end
scenario 'should not have access to admin dashboard' do
visit '/admin'
page.should have_content 'Log in'
end
end
И я получаю следующий сбой:
Failures:
1) A signed in user should not have access to admin dashboard
Failure/Error: visit '/admin'
CanCan::AccessDenied:
You are not authorized to access this page.
Чтобы быть понятным, все мое управление разрешениями работает, как и ожидалось, за исключением перенаправления на страницу входа.
Вот как все устроено:
ApplicationController:
check_authorization :unless => :devise_controller? # Cancan
rescue_from CanCan::AccessDenied do |exception|
redirect_to login_path, alert: exception.message
end
UsersController
class UsersController < ApplicationController
load_and_authorize_resource # Cancan
def queue
...
end
...
end
AdminsController
class AdminController < ActionController::Base
authorize_resource :class => false # Cancan, used because AdminController doesn't have an associated model
...
end
ability.rb
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # guest user, not logged in
can :queue, User
if user.has_permission? :super_admin
can :manage, :all
elsif user.has_permission? :network_admin
end
end
end
Что мне не хватает?
3 ответа
Мой Admins Controller не был Внесение изменений решило мою проблему.
Вы должны передать имя класса в виде строки. попробуйте процитировать это. или попробуйте
rescue_from CanCan::AccessDenied , :with => :login_page
private
def login_page
redirect_to login_path
end
Вы должны добавить "controller.authorize_resource" к возможностям admin/register.if без условий.
controller.authorize_resource
Пример: can: manage,: all
Если условия
controller do
load_and_authorize_resource :except => [:update,:index, :show, :edit]
def scoped_collection
end_of_association_chain.accessible_by(current_ability)
end
end
Пример: can:manage, Master::Country,:organization_branch_id => each_branch.id
я надеюсь, что это поможет вам