1

ユーザー認証と権限のために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.

明確にするために、ログインページへのリダイレクトを除いて、これまでのところすべての権限管理が期待どおりに機能しています。


設定方法は次のとおりです。

アプリケーションコントローラー:

check_authorization :unless => :devise_controller? # Cancan

rescue_from CanCan::AccessDenied do |exception|
  redirect_to login_path, alert: exception.message
end

ユーザーコントローラー

class UsersController < ApplicationController
  load_and_authorize_resource         # Cancan
  def queue  
    ...
  end

  ...
end

管理者コントローラー

class AdminController < ActionController::Base
  authorize_resource :class => false # Cancan, used because AdminController doesn't have an associated model
  ...
end

アビリティ.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

私は何が欠けていますか?

4

3 に答える 3

0

クラス名を文字列として渡す必要があります。引用してみてください。または試す

rescue_from CanCan::AccessDenied , :with => :login_page
private
def login_page
   redirect_to login_path
end
于 2012-12-26T21:19:00.763 に答える
0

admin/register.if アビリティに無条件で「controller.authorize_resource」を追加する必要があります。

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

私はそれがあなたを助けることを願っています

于 2012-12-26T21:19:18.660 に答える
0

私の Admins Controller は < ApplicationController ではなかったため、ApplicationController の rescue_from メソッドをロードしませんでした。

変更を加えることで問題が解決しました。

于 2012-12-26T22:27:15.937 に答える