2009-10-09 3 views
1

Я пытаюсь получить метод permit работать, используя rails-authorization-plugin и authlogic, и я продолжаю работать в эту ошибку:Rails Authorization плагин Ошибка

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

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

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

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

permit 'admin' 

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

ОДНАКО ...

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

Итак, я попытался следующие:

permit 'admin', :get_user_method => current_user 

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

Так

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

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

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

0

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

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

permit 'admin' 

Вот и все.

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

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

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

Я изменил его, как вы предлагали (на глобальном уровне), так что теперь он просто читает 'allow 'admin'', но я все равно получаю ту же ошибку. Я получаю ту же ошибку, когда я пытаюсь сделать это на уровне действия. ?? – neezer