2010-07-29 14 views
1

J'utilise authlogic pour authentifier les utilisateurs. Dans mes contrôleurs j'utilise current_user, défini (comme indiqué) comme suit:Détermination de current_user avec declarative_authorization et authlogic

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 

J'utilise aussi declarative_authorization pour gérer les autorisations de l'utilisateur actuel. Tout fonctionne correctement dans le scénario d'exécution normal, mais lorsque je crée des tests fonctionnels qui utilisent des instructions de requête telles que "get_with", current_user dans le contrôleur est nul. J'ai regardé le code auxiliaire de test declareative_authorization et j'ai trouvé que dans ce scénario, la gemme declarative_authorization stocke réellement l'utilisateur actuel dans Authorization.current_user (qui vient à son tour de Thread.current ["current_user"]). Donc, il semble y avoir une confusion de la façon dont un utilisateur actuel est géré dans différents scénarios.

Ma question: quelle est la manière appropriée de trouver current_user dans le runtime normal et le scénario de test?

Répondre

0

Angelus, vous aviez raison. Je ne devrais pas utiliser get_with, post_with, etc. Il suffit de définir Authorization.current_user, session [: user] et session [: user_id] et ceux-ci semblent être obsolètes avec authlogic. Et pour une raison quelconque, ils ont même mis UserSession à zéro, ce qui causait le problème. Donc, UserSession.create (users (: admin)), suivi d'un get, d'un post, etc. est le chemin à suivre.

0

Vous pouvez définir un before_filter comme ceci dans application_controller.

Avant_filtre {| c | Authorization.current_user = c.current_user}

+0

Oui, j'ai essayé. Mais c'est l'inverse: dans le test fonctionnel, Authorization.current_user contient l'utilisateur correct, mais c.current_user == nil. Donc, cette déclaration ne fonctionnera pas ... –

+0

Une question comment maintenez-vous votre session d'utilisateur dans les tests? Essayez de déboguer la session peut-être qu'il persiste maintenant pour une raison quelconque. –

+1

En ce qui me concerne, pour se connecter à un utilisateur avec authlogic, vous devez créer sa session via UserSession.create (utilisateur (: admin)), puis l'utilisateur actuel d'authlogic fonctionne. – Draiken