authlogic UserSession.create(@user)给予unauthorized_record

我正在尝试显式创建一个像这个UserSession.create(@user, true)的会话UserSession.create(@user, true)但是没有创建会话, current_usernil

但是当我这样做时,我得到“”}>

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

我在这里看了一下Authlogic :: Session :: UnauthorizedRecord

小心这一点,因为Authlogic假设你已经确认用户是他所说的那个人。 例如,这是用于在内部持久保存会话的方法。 Authlogic查找具有持久性令牌的用户。 此时我们知道用户就是他所说的那样,因此Authlogic只是创建了一个记录会话。 这对于第三方身份validation方法(如OpenID)特别有用。 让该方法validation身份,一旦validation,传递对象并创建会话。

这正是我想要做的(我使用omniauth进行身份validation并使用authlogic创建会话)。

我如何解决这个问题,以便我可以在current_user获得有效的会话?

我不确定.create(object,bool)方法签名,但以下使用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 

如果这对你不起作用 - 我认为@user没有正确设置。

我有一个类似的问题,因为persistence_token是用户的nil。 在创建UserSession之前重置它。 所以…

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

如果将active_record_store映射到authlogic user_sessions表,则会话信息将存储在数据库中,您将能够存储更大的数据集。

在配置文件夹中: config/initializers/session_store.rb

  • 注释掉App::Application.config.session_store :cookie_store, :key => '_App_session'
  • 添加或取消注释App::Application.config.session_store :active_record_store

config/application.rb里面

  • 在您的应用程序类的末尾添加: ActiveRecord::SessionStore::Session.table_name = 'user_sessions'

重新启动您的应用程序,存储在用户会话中的任何信息都将保存在authlogic user_sessions表中。

转到: http : //apidock.com/rails/ActiveRecord/SessionStore了解更多信息

现在你可以更换

 UserSession.create @user 

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

没有大碍。

但那引起了我的反响。 我忘了我的用户active? == false 创建时active? == false 。 我将其设置为true并创建了会话。

我今天遇到了这个问题。 在我的情况下,它最终与CSRF令牌有关。

我们正在应用中创建用户和会话以响应OAuth回调。 看来如果CSRF令牌无效,来自第三方的情况就是如此,authlogic将不会创建用户会话。

无法validationCSRF令牌的真实性

修复很简单:

 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