0

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

但是当我这样做时,我得到<#UserSession: {:unauthorized_record=>""}>

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

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

请注意这一点,因为 Authlogic 假设您已经确认用户就是他所说的那个人。例如,这是用于在内部持久化会话的方法。Authlogic 找到具有持久性令牌的用户。在这一点上,我们知道用户就是他所说的那个人,所以 Authlogic 只是用记录创建一个会话。这对于 OpenID 等 3rd 方身份验证方法特别有用。让该方法验证身份,一旦验证,传递对象并创建会话。

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

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

4

5 回答 5

3

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

@user.reset_persistence_token!
UserSession.create(@user, true)
于 2012-06-05T18:37:36.013 回答
2

我不确定 .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 设置不正确。

于 2010-11-15T00:04:31.133 回答
1

如果将 映射active_record_storeauthlogic 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 了解更多信息

于 2013-10-23T17:14:07.450 回答
0

现在你可以更换

UserSession.create @user

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

没有大碍。

但这以另一种方式吸引了我。我忘记了我的用户active? == false在创建时得到了。我已将其设置为true并创建了会话。

于 2011-03-10T21:01:26.453 回答
0

我今天遇到了这个问题。就我而言,它最终与 CSRF 令牌有关。

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

无法验证 CSRF 令牌的真实性

修复很简单:

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
于 2016-09-13T19:54:34.380 回答