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
。你有什么想法吗?