【问题标题】:authlogic UserSession.create(@user) giving unauthorized_recordauthlogic UserSession.create(@user) 给予未授权记录
【发布时间】:2010-11-14 23:52:52
【问题描述】:

我正在尝试像 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 只是用记录创建一个会话。这对于 OpenID 等 3rd 方身份验证方法特别有用。让该方法验证身份,一旦验证,传递对象并创建会话。

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

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

【问题讨论】:

  • 我在遇到同样问题时发现了您的问题。我发现您可能确实拥有一个有效的current_user,只是无法像您想象的那样访问。查看我对其他类似问题的回答:stackoverflow.com/questions/6638927/…

标签: ruby-on-rails authlogic omniauth


【解决方案1】:

我遇到了类似的问题,原因是用户的 persistence_token 为 nil。在创建 UserSession 之前重置它。所以...

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

【讨论】:

    【解决方案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 设置不正确。

    【讨论】:

    • 不!结果仍然相同其未经授权的原因?应该有办法!
    • 好的,我发现了这个错误。保存用户对象时没有设置persistence_token!。谢谢!
    • 我遇到了同样的问题; persistence_token 为 nil,但你是如何解决这个问题的?
    【解决方案3】:

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

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

    • 注释掉App::Application.config.session_store :cookie_store, :key =&gt; '_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 欲了解更多信息

    【讨论】:

      【解决方案4】:

      现在你可以替换

      UserSession.create @user
      

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

      没什么大不了的。

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

      【讨论】:

        【解决方案5】:

        我今天遇到了这个问题。就我而言,它最终与 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-21
          • 1970-01-01
          • 1970-01-01
          • 2022-08-24
          • 2016-03-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多