authlogic UserSession.create(@user)给予unauthorized_record
我正在尝试显式创建一个像这个UserSession.create(@user, true)
的会话UserSession.create(@user, true)
但是没有创建会话, current_user
是nil
。
但是当我这样做时,我得到“”}>
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