当会话已经存在时,Devise不会登录

时间:2015-11-30 17:51:36

标签: ruby-on-rails devise

我和Devise有点问题。当我尝试使用某个帐户登录时,当我使用其他帐户登录时,Devise会持续保存我登录的第一个帐户的会话。

当我首先通过omniauth登录,然后尝试使用Devise手动登录时,会发生这种情况。

这是我的omniauth_controller

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController

  respond_to :json

  def facebook
    @user = User.from_omniauth(request.env["omniauth.auth"]) if request.env["omniauth.auth"].present?
    if @user && @user.persisted?
      sign_in @user
      cookies[:uId] = @user.id
    else
      session["devise.facebook_data"] = request.env["omniauth.auth"]
    end
    redirect_to root_url
  end
end

我的user.rb文件:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :omniauthable, :omniauth_providers => [:facebook]

  def self.from_omniauth(auth)
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
      user.email = auth.info.email
      user.password = Devise.friendly_token[0,20]
      user.name = auth.info.name   # assuming the user model has a name
      user.image = auth.info.image # assuming the user model has an image
    end
  end

  def self.new_with_session(params, session)
    super.tap do |user|
      if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"]
        user.email = data["email"] if user.email.blank?
      end
    end
  end
end

1 个答案:

答案 0 :(得分:0)

这是因为设计方式是在会话中存储数据。当您手动登录时,它存储user_id,而当您使用omniauth时,它会在会话中存储其他数据以了解如何进行身份验证。

当用户访问登录/退出页面时,您可以手动清除它:

rake db:sessions:clear

当然,建议GET请求永远不要操纵你可能不希望在新操作上执行此操作的状态,而只应该执行destroy操作。

如果只是为了测试开发时间,可以运行find_all()