我目前正在使用Rails构建Web应用程序。我正在使用Authlogic来处理正常的身份验证。我正在使用facebooker处理外部网站上的facebook连接,并在facebook画布应用程序中验证用户。
我在构建简单,一致的current_user功能时遇到了麻烦。目前我有一大堆不同的方法来获取/设置当前用户,我想尽可能地简化它。
我在我的会话中使用active_record_store(在environment.rb中定义) 这是我的应用程序控制器:
class ApplicationController < ActionController::Base
helper :all # include all helpers, all the time
protect_from_forgery # See ActionController::RequestForgeryProtection for details
filter_parameter_logging :fb_sig_friends, :password, :password_confirmation
helper_method :facebook_session, :current_user_session, :current_user
before_filter :fb_setup
attr_accessor :current_user
helper_attr :current_user
#Before filter to decide if we should use facebook sessions to set current user
def fb_setup
if request_comes_from_facebook?
ensure_authenticated_to_facebook
set_current_fb_user
end
end
############
# AuthLogic
############
def current_user_session
return @current_user_session if defined?(@current_user_session)
@current_user_session = UserSession.find
end
def current_user
return @current_user if defined?(@current_user)
@current_user = current_user_session && current_user_session.user
end
##########
# Facebook
##########
def create_user
self.current_user = User.for(facebook_session.user.to_i, facebook_session)
end
def set_current_fb_user
self.current_user = User.for(facebook_session.user.to_i, facebook_session)
end
end
在我的用户模型中,我有这些方法来帮助从facebook id中查找/创建用户: def self.for(facebook_id,facebook_session = nil) 返回find_or_create_by_facebook_id(facebook_id)do | user | 除非facebook_session.nil? user.store_session(facebook_session.session_key) 结束 结束 端
def store_session(session_key)
if self.session_key != session_key
update_attribute(:session_key,session_key)
end
end
def facebook_session
@facebook_session ||=
returning Facebooker::Session.create do |session|
session.secure_with!(session_key,facebook_id,1.day.from_now)
end
end
令人困惑的是,只有在需要current_user时才会调用authlogic的方法,但是在每次请求之前都会调用facebook的set_current_fb_user。
无论哪个会话负责设置current_user,我都需要以相干方式在application_controller中设置self.current_user或@current_user。我在这方面遇到了麻烦,其余的代码库因此而受到影响。如果有人有任何建议,我将不胜感激。
如果您需要任何其他信息,我将很乐意提供。
由于
答案 0 :(得分:0)
每个请求都会调用set_current_fb_user
方法,因为它是从fb_setup
调用的,before_filter
是ApplicationController
(并且所有控制器都从{{1}继承})。但是,您没有始终调用ApplicationController
的任何before_filter
方法。因此,请尝试将current_user
行更改为:
before_filter
请注意,如果before_filter [:set_current_fb_user, :current_user]
返回false值,则不会调用set_current_fb_user
。
有关详细信息,请参阅Rails Action Controller Guide。