2009-10-09 7 views
1

J'essaie d'obtenir la méthode permit au travail en utilisant la rails-authorization-plugin et authlogic, et je continue à courir dans cette erreur:Rails d'autorisation Erreur du plugin

Lorsque je tente:

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

Je reçois ce :

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

maintenant, j'ai ma configuration de la méthode current_user, et il fonctionne, parce que je l'ai utilisé à peu près partout ailleurs dans mon application:

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 

    ... 

Je sais aussi que j'ai des utilisateurs avec les rôles appropriés dans ma base de données, car cette méthode fonctionne:

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 

je peux faire tout ce travail si je viens de vérifier le niveau de l'utilisateur en utilisant ceci:

before_filter :require_admin, :only => 'index' 

... mais je ne devrais pas être en mesure de la même chose efficacement avec permit et permit??

Toute aide serait grandement appréciée. Faites-moi savoir si vous avez besoin de voir plus de code et je serai heureux de le poster. Il n'y a vraiment rien sur Google que je puisse faire face à la nécessité de faire fonctionner ces deux systèmes les uns avec les autres.

Répondre

2

D'accord, je pense que je compris.

Comme Jared souligné à juste titre, l'utilisation correcte est

permit 'admin' 

(pas dans le cadre d'un before_filter).

CEPENDANT ...

... la valeur par défaut :get_user_method est réglé sur #current_user, qui est ce que le plugin utilise acts_as_authenticated. Je, comme indiqué précédemment, utilise AuthLogic, où j'ai la méthode définie comme current_user (sans le signe dièse).

Alors, je l'avais essayé ce qui suit:

permit 'admin', :get_user_method => current_user 

Seulement pour être accueilli par un message d'erreur expliquant bien que je n'avais pas une telle variable ou méthode.Ce qui me manquait, cependant, c'est que l'option de hachage prend une chaîne, pas un appel direct à la méthode !! (Erreur stupide, je sais!)

Alors

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

... semble fonctionner pour moi. J'aime Ruby et Rails, mais parfois sa simplicité peut être une malédiction propre; Je me fais toujours posséder par les choses simples. :)

0

Vous utilisez incorrectement le plugin. Il ne devrait pas être placé dans un filtre avant.

Au niveau mondial, vous simplement déclarer:

permit 'admin' 

Voilà. Toutes vos actions rechercheront un objet current_user ou @user et redirigeront vers la page de connexion si ce n'est pas le cas.

Sur vous utilisez le niveau par action, comme un bloc:

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

Je l'ai modifié comme vous l'avez suggéré (au niveau global) alors maintenant il lit simplement 'permis 'admin'', mais je reçois toujours la même erreur. J'ai la même erreur quand j'essaye de le faire au niveau par action. ?? – neezer