12

我有一个管理员控制器,我希望只有定义为管理员的用户才能访问该控制器。

我的能力等级:

class Ability
  include CanCan::Ability

  def initialize(user)
    if user.admin?
      can :manage, :all
    else
      can :read, :all
    end
  end
end

我的管理员控制器:

class AdminController < ApplicationController
  load_and_authorize_resource

  def index
  end

  def users_list
  end
end

当我尝试访问/admin/users_list(使用管理员用户或不使用管理员用户)时,我收到以下错误:uninitialized constant Admin

我究竟做错了什么?这是限制对控制器的访问的正确方法吗?

4

5 回答 5

30

这是因为当您使用load_and_authorize_resource时,您的控制器必须由名为Admin的模型支持(因为您的控制器称为 AdminController)。因此,您需要创建此模型或将load_and_authorize_resource替换为:

授权资源 :class => false

这会导致针对您的操作而不是模型进行访问检查。请注意,不幸的是,这会导致通用访问符号(例如:manage:read)停止工作,要求您直接在ability.rb中引用控制器操作:

可以 [ :index, :users_list ], :admin

其中第一个参数是用户可以访问的控制器操作数组,第二个参数是控制器的短名称

于 2010-12-31T20:40:21.510 回答
7

您可以在控制器中放置授权

authorize_resource :class => false

或者

authorize_resource :class => :controller

然后更改您的 app/models/Ability.rb 文件

can :manage, :controller_name

看到这个

于 2012-12-31T06:15:20.403 回答
3

选中此项为非 RESTful 控制器添加授权规则:

https://github.com/ryanb/cancan/wiki/Non-RESTful-Controllers

希望这可以帮助。

于 2010-12-30T06:34:12.673 回答
1

这是因为当您制作通用控制器时,将 load_and_authorize_resource 放入应用程序控制器或管理控制器无法像此示例一样找到它来自的实际类。这将起作用。

class Admin::HomeController < Admin::ApplicationController
    def home    
    end
  end

  class Admin::ApplicationController < ApplicationController
    load_and_authorize_resource :class => self.class
  end
于 2011-12-23T13:36:28.730 回答
0

我遇到过同样的问题。我的解决方案是定义一个不能的能力。定义只有管理员才能做的事情,我正在定义没有管理员用户不能做的事情。在您的代码中将是这样的:

管理员控制器:

class AdminController < ApplicationController
 authorize_resource :class => AdminController

 def index
 end

 def users_list
 end
end

能力.rb:

class Ability
 include CanCan::Ability

 def initialize(user)
  if user.admin?
   can :manage, :all
  else
   can :read, :all
   cannot [:index, :users_list], AdminController
  end
 end
end
于 2015-02-18T12:01:31.577 回答