Использование cancan для предотвращения доступа к контроллеру - PullRequest
12 голосов
/ 25 декабря 2010

У меня есть контроллер администратора, и я хочу, чтобы только пользователи, определенные как администратор, имели доступ к этому контроллеру.

мой класс способностей:

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

Что я делаю не так? Это правильный способ ограничить доступ к контроллеру?

Ответы [ 5 ]

30 голосов
/ 31 декабря 2010

Это связано с тем, что при использовании load_and_authorize_resource ваш контроллер должен поддерживаться моделью с именем Admin (поскольку ваш контроллер называется AdminController). Таким образом, вам нужно либо создать эту модель, либо заменить load_and_authorize_resource на:

authorize_resource: class => false

, который вызывает проверку доступа на основе ваших действий, а не модели. Обратите внимание, что это, к сожалению, приводит к тому, что общие символы доступа, такие как : управление и : чтение , перестают работать, требуя, чтобы вы ссылались на действия контроллера непосредственно в способность. 1019 * can [: index,: users_list],: admin

где первый аргумент - это массив действий контроллера, к которым пользователь может получить доступ, а второй аргумент - это короткое имя контроллера

6 голосов
/ 31 декабря 2012

Вы можете поставить авторизацию в вашем контроллере

authorize_resource :class => false

или

authorize_resource :class => :controller

Затем измените ваше приложение / models / Ability.rb file

can :manage, :controller_name

См. это

3 голосов
/ 30 декабря 2010

Отметьте это, чтобы добавить правила авторизации для контроллеров без restful:

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

Надеюсь, это поможет.

1 голос
/ 23 декабря 2011

Это потому, что когда вы создаете универсальный контроллер, помещаете 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
0 голосов
/ 18 февраля 2015

У меня была такая же проблема.Мое решение было определить не может способность.Определив, что может делать только администратор, я определяю, что не может делать ни один пользователь-администратор.В вашем коде было бы что-то вроде этого:

Контроллер администратора:

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
...