在我的Rails应用程序中,我必须使用模型:Account&用户。我使用MongoID和Devise与Omniauth。
我在使用此配置正确登录用户方面存在一些问题并提出警告:
class Account
#code..
include Mongoid::Document
embeds_many :users
#code..
end
class User
#code..
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable
devise :omniauthable, omniauth_providers: [:twitter] #just an example..
include Mongoid::Document
embedded_in :account
#code..
end
一个非常标准的OmniauthCallbacksController:
class OmniauthCallbacksController < Devise::OmniauthCallbacksController
def twitter
callback_of('Twitter')
end
protected
def callback_of(provider)
@user = User.find_user_from(request.env["omniauth.auth"])
@user = User.new_with(request.env["omniauth.auth"]) if @user.blank?
if @user.persisted?
sign_in_and_redirect @user, event: :authentication #this will throw if @user is not activated
set_flash_message(:notice, :success, kind: provider) if is_navigational_format?
else
redirect_to new_user_registration_path, alert: "There was a problem with your #{provider} account. Please try again."
end
end
def after_sign_in_path_for(resource)
if resource.registered
account_path(resource.account)
else
new_account_path
end
end
end
该代码效果很好,如果用户未注册,则创建帐户文档并在其中存储嵌入的用户文档。然后它被称为sign_in_and_redirect @user, event: :authentication
并且用户已正确登录。然后重定向到new_account_path
,其中事情变得奇怪..
重定向后,用户不再登录,因此所有设计助手(如current_user
)都无用。我想这是因为用户被嵌入帐户中,因此Warden无法正确找到用户。
我发现了这个Devise wiki&#39; post,但似乎已经过时了。
我不是设计/监护专家,所以我需要一些帮助。任何帮助将非常感激。
谢谢!