Ошибка плагина авторизации Rails - PullRequest
1 голос
/ 10 октября 2009

Я пытаюсь заставить метод 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 нет ничего, что я мог бы придумать, как заставить эти две системы работать друг с другом.

Ответы [ 2 ]

2 голосов
/ 10 октября 2009

Хорошо, думаю, я понял это.

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

permit 'admin'

(Не является частью before_filter).

ОДНАКО ...

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

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

permit 'admin', :get_user_method => current_user

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

So

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

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

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

0 голосов
/ 10 октября 2009

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

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

permit 'admin'

Вот и все.

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

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

def index
  permit 'admin' do
    @some_models = SomeModel.all
  end
end
...