Я сейчас создаю веб-приложение в Rails. Я использую Authlogic для обработки обычной аутентификации. Я использую facebooker для обработки facebook connect на внешнем сайте и для аутентификации пользователей в приложении facebook canvas.
У меня проблемы с созданием простой, согласованной функциональности 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
И в моей модели User у меня есть следующие методы, которые помогут найти / создать пользователя по идентификатору facebook:
def self.for (facebook_id, facebook_session = nil)
возвращение find_or_create_by_facebook_id (facebook_id) do | пользователь |
разве что 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
Что смущает это, так это то, что методы authlogic вызываются только тогда, когда требуется current_user, но set_current_fb_user facebook вызывается перед каждым запросом.
Мне нужно, чтобы self.current_user или @current_user были согласованно установлены в application_controller независимо от того, какой сеанс отвечает за установку current_user. У меня проблемы с этим, и остальная часть моей кодовой базы страдает из-за этого. Если у кого-нибудь есть какой-либо совет, он будет очень признателен.
Если вам понадобится дополнительная информация, я с радостью ее предоставлю.
Спасибо