Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Authorization 使用cancan阻止对控制器的访问_Authorization_Ruby On Rails 3_Cancan - Fatal编程技术网

Authorization 使用cancan阻止对控制器的访问

Authorization 使用cancan阻止对控制器的访问,authorization,ruby-on-rails-3,cancan,Authorization,Ruby On Rails 3,Cancan,我有一个管理员控制器,我希望只有被定义为管理员的用户才能访问该控制器 我的能力等级: class Ability include CanCan::Ability def initialize(user) if user.admin? can :manage, :all else can :read, :all end end end 我的管理员控制器: class AdminController < ApplicationCo

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

我的能力等级:

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
class AdminController < ApplicationController
 authorize_resource :class => AdminController

 def index
 end

 def users_list
 end
end
class AdminController
当我尝试访问
/admin/users\u list
(有管理员用户或没有管理员用户)时,我得到以下错误:
未初始化常量admin


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

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


希望这有帮助。

这是因为当您使用加载和授权资源时,您的控制器必须由名为Admin的模型支持(因为您的控制器称为AdminController)。因此,您需要创建此模型或用以下内容替换加载资源和授权资源

授权\u资源:类=>false

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

can[:索引,:用户\列表],:管理员


其中,第一个参数是用户可以访问的控制器操作数组,第二个参数是控制器的短名称,这是因为在创建通用控制器时,放置load_和authorize_资源,然后应用程序控制器或管理控制器无法找到它来自的实际类,如本例所示。这会奏效的

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

  class Admin::ApplicationController < ApplicationController
    load_and_authorize_resource :class => self.class
  end
authorize_resource :class => false
class Admin::HomeControllerself.class
结束

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

authorize_resource :class => false

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

can :manage, :controller_name

我也有同样的问题。我的解决方案是定义一个不能的能力。我不是定义只有管理员才能做什么,而是定义没有管理员的用户不能做什么。在您的代码中,应该是这样的:

管理员控制器:

class AdminController < ApplicationController
  load_and_authorize_resource

  def index
  end

  def users_list
  end
end
class AdminController < ApplicationController
 authorize_resource :class => AdminController

 def index
 end

 def users_list
 end
end

嗨,如果我想按类型分割伪造的资源呢。例如,我的项目中有许多报告,但没有模型。不同的视图使用特定的报告名称转到
reports\u controller.rb
中的相同操作
build
。我试图定义如下能力:
can:read、:reports、name:['Orders'、'Payments']
然后检查权限:
if can?:读取,:reports,name:'Orders'
但发生错误
未定义的方法'name':reports:Symbol
。你有什么想法吗?