2010-11-14 23 views
0

J'essaie de créer une session explicitement comme ceci UserSession.create(@user, true) mais la session n'est pas créée, current_user est nil.authlogic UserSession.create (@user) donnant un enregistrement non autorisé

Mais quand je fais cela, je reçois < #UserSession: {: unauthorized_record => ""}>

us = UserSession.create(@user, true) 
RAILS_DEFAULT_LOGGER.info(us.inspect) #=> UserSession: {:unauthorized_record=>""} 

J'ai regardé Authlogic::Session::UnauthorizedRecord ici il dit

Soyez prudent avec car Authlogic suppose que vous avez déjà confirmé que l'utilisateur est ce qu'il dit être. Par exemple, c'est la méthode utilisée pour persister la session en interne. Authlogic trouve l'utilisateur avec le jeton de persistance. À ce stade, nous savons que l'utilisateur est ce qu'il dit être, alors Authlogic crée simplement une session avec le dossier. Ceci est particulièrement utile pour les méthodes d'authentification tierces, telles que OpenID. Laissez cette méthode vérifier l'identité, une fois qu'elle est vérifiée, passez l'objet et créez une session.

ce qui est exactement ce que j'essaie de faire (je m'authentifie en utilisant omniauth et en créant une session en utilisant authlogic).

Comment résoudre ce problème, afin que je puisse obtenir une session valide dans current_user?

+0

J'ai trouvé votre question tout en éprouvant le même problème. J'ai trouvé que vous avez probablement _do_ avoir un current_user valide mais pas accessible comme vous le pensez. Consultez ma réponse sur cette autre question similaire: http://stackoverflow.com/questions/6638927/usersession-unauthorized-record-protected/33636110#33636110 – Aaron

Répondre

2

Je ne suis pas sûr de la signature de la méthode .create (objet, bool), mais les opérations suivantes utilisent authlogic.

class Api::ApiBaseController < ApplicationController 
    protected 

    def verify_token  
    return false if params[:token].blank? 
    @session = UserSession.new(User.find_by_single_access_token(params[:token])) 
    @session.save 
    end 
end 

Si cela ne fonctionne pas pour vous - je pense que le @user n'est pas défini correctement.

+0

nope! toujours le même résultat <#UserSession: {: unauthorized_record => ""}> Je suis en train d'enregistrer l'objet utilisateur sans passer par les validations authlogic, comme ceci: @ user.save (false) évidemment authlogic ne trouve pas mot de passe et email , cela peut-il être une raison pour laquelle il n'est pas autorisé? il devrait y avoir un moyen! – Madhusudhan

+0

ok j'ai trouvé le bug. persistence_token n'était pas défini lorsque l'objet utilisateur a été enregistré !. Merci! – Madhusudhan

+3

Je reçois le même problème; persistence_token est nul, mais comment avez-vous résolu cela? –

0

Pour l'instant, vous pouvez remplacer

UserSession.create @user 

à

UserSession.create :email => @user.email, :password => @user.password 

pas une grosse affaire.

Mais cela m'a pris d'une autre façon. J'ai oublié que mon utilisateur a obtenu active? == false lorsqu'il a été créé. Je l'ai mis à true et la session est créée.

3

J'ai eu un problème similaire causé par le persistence_token étant nul sur l'utilisateur. Réinitialisez-le avant de créer la session utilisateur. Alors ...

@user.reset_persistence_token! 
UserSession.create(@user, true) 
+0

Cela a fonctionné le tour pour moi! –

1

Si vous associez la active_record_store à la table authlogic user_sessions vos informations de session seront stockées dans la base de données, et vous serez en mesure de stocker plus grands ensembles de données.

dans votre dossier de configuration: config/initializers/session_store.rb

  • Commentaire sur App::Application.config.session_store :cookie_store, :key => '_App_session'
  • Ajouter ou uncomment App::Application.config.session_store :active_record_store

intérieur de config/application.rb

  • A la fin de la classe pour vous ajouter de l'application: ActiveRecord::SessionStore::Session.table_name = 'user_sessions'

Redémarrez votre application, et toutes les informations stockées dans la session utilisateur sera enregistré dans la table authlogic de user_sessions.

Aller à: http://apidock.com/rails/ActiveRecord/SessionStore Pour plus d'informations

0

Je suis tombé sur ce problème aujourd'hui. Dans mon cas, il a fini par être lié à des jetons CSRF.

Nous créons un utilisateur et une session dans notre application en réponse à un rappel OAuth. Il semble que si le jeton CSRF est invalide, ce qui serait le cas lorsqu'il provient d'un tiers, authlogic ne créera pas la session utilisateur.

Impossible de vérifier l'authenticité jeton CSRF

La solution était simple:

class Oauth::UserSessionsController < ApplicationController 
    skip_before_action :verify_authenticity_token, only: :callback 

    def new 
    # code removed... 
    end 

    def callback 
    # code removed... 
    UserSession.create(@user) 
    redirect_to root_path 
    end 
end