Rails - Authlogic и приложение для Facebook - связный Current_User - PullRequest
1 голос
/ 03 марта 2010

Я сейчас создаю веб-приложение в 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. У меня проблемы с этим, и остальная часть моей кодовой базы страдает из-за этого. Если у кого-нибудь есть какой-либо совет, он будет очень признателен.

Если вам понадобится дополнительная информация, я с радостью ее предоставлю.

Спасибо

1 Ответ

0 голосов
/ 04 марта 2010

Метод set_current_fb_user вызывается при каждом запросе, потому что он вызывается из fb_setup, то есть before_filter из ApplicationController (а все контроллеры наследуются от ApplicationController). Однако у вас нет метода before_filter, который всегда вызывает current_user. Итак, попробуйте изменить строку before_filter на:

before_filter [:set_current_fb_user, :current_user]

Обратите внимание, что если set_current_fb_user возвращает ложное значение, то current_user вызываться не будет.

Для получения дополнительной информации см. Руководство по контроллеру действий Rails .

...