authlogic UserSession.create(@user)给予unauthorized_record

时间:2010-11-14 23:52:52

标签: ruby-on-rails authlogic omniauth

我正在尝试显式创建一个类似于此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)特别有用。让该方法验证身份,一旦验证,就传递对象并创建会话。

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

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

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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未正确设置。

答案 2 :(得分:1)

如果您将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 有关更多信息

答案 3 :(得分:0)

现在你可以替换

UserSession.create @user

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

没什么大不了的。

但这让我感到异常。我忘记了我的用户在创建时获得了active? == false。我已将其设置为true并创建了会话。

答案 4 :(得分: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