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

я надеюсь, что это поможет вам

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