使用cancan防止访问控制器

Ran*_*Ran 12 authorization cancan ruby-on-rails-3

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

我的能力课:

class Ability
  include CanCan::Ability

  def initialize(user)
    if user.admin?
      can :manage, :all
    else
      can :read, :all
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我的管理控制器:

class AdminController < ApplicationController
  load_and_authorize_resource

  def index
  end

  def users_list
  end
end
Run Code Online (Sandbox Code Playgroud)

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

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

Lar*_*ann 30

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

authorize_resource:class => false

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

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

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


smi*_*trp 6

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

authorize_resource :class => false
Run Code Online (Sandbox Code Playgroud)

要么

authorize_resource :class => :controller
Run Code Online (Sandbox Code Playgroud)

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

can :manage, :controller_name
Run Code Online (Sandbox Code Playgroud)

看到这个


小智 3

检查此项以添加非静态控制器的授权规则:

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

希望这可以帮助。