Ошибка плагина авторизации Rails

Я пытаюсь заставить метод permit работать с помощью rails-authorization-plugin. и authlogic, и я продолжаю сталкиваться с этой ошибкой:

Когда я пытаюсь:

class ApplicationController < ActionController::Base
  ...
  before_filter permit 'admin'
  ...

Я получаю это:

Authorization::CannotObtainUserObject in HomeController#index
Couldn't find #current_user or @user, and nothing appropriate found in hash

Теперь у меня есть настройка метода current_user, и он работает, потому что я использовал его почти везде в своем приложении:

class ApplicationController < ActionController::Base
  ...

  helper_method :current_user

  private

  def current_user_session
    return @current_user_session if defined?(@current_user_session)
    @current_user_session = UserSession.find
  end

  def current_user
    return @current_user if defined?(@current_user)
    @current_user = current_user_session && current_user_session.record
  end

  ...

Я также знаю, что у меня есть пользователи с соответствующими ролями в моей базе данных, потому что этот метод работает:

def require_admin
   unless current_user.is_admin? || current_user.is_root?
      flash[:warning] = 'You are not an administrator and cannot access this page.'
      redirect_to root_path
   end
end

Я могу заставить все работать, если я просто проверю на уровне пользователя, используя это:

before_filter :require_admin, :only => 'index'

... но разве я не могу сделать то же самое эффективно с permit и permit??

Любая помощь приветствуется. Дайте мне знать, если вам нужно увидеть больше кода, и я буду рад опубликовать его. На самом деле в Google нет ничего, что я мог бы сказать о том, чтобы эти две системы работали друг с другом.


person neezer    schedule 09.10.2009    source источник


Ответы (2)


Ладно, думаю, я понял.

Как правильно заметил Джаред, правильное использование

permit 'admin'

(Не как часть before_filter).

ОДНАКО...

... по умолчанию для :get_user_method установлено значение #current_user, которое использует плагин acts_as_authenticated. Я, как отмечалось ранее, использую AuthLogic, где у меня есть метод, определенный как current_user (без знака фунта).

Итак, я пробовал следующее:

permit 'admin', :get_user_method => current_user

Только для того, чтобы меня приветствовало красивое сообщение об ошибке, объясняющее, что у меня нет такой переменной или метода. Однако мне не хватало того, что опция hash принимает строку, а не прямой вызов метода!! (глупая ошибка, я знаю!)

So

permit 'admin', :get_user_method => 'current_user'

... кажется, работает для меня.

Я люблю Ruby и Rails, но иногда их простота сама по себе может быть проклятием; Я всегда владею простыми вещами. :)

person neezer    schedule 10.10.2009

Вы неправильно используете плагин. Его не следует помещать в предварительный фильтр.

На глобальном уровне вы просто объявляете:

permit 'admin'

Вот и все.

Все ваши действия будут искать объект current_user или @user и перенаправлять на страницу входа, если нет.

На уровне действия вы используете его как блок:

def index
  permit 'admin' do
    @some_models = SomeModel.all
  end
end
person Jared    schedule 10.10.2009
comment
Я изменил его, как вы предложили (на глобальном уровне), так что теперь он просто читает permit 'admin', но я все еще получаю ту же ошибку. Я получаю ту же ошибку, когда пытаюсь сделать это на уровне действия. ?? - person neezer; 10.10.2009