我目前正在开发一款Facebook应用,要求用户在访问该应用之前登录。
我在before_filter
上有application_controller
来检查用户是否已登录,如果没有,则将其重定向到正确的路径。
这是迄今为止的代码:
Application Controller
before_filter :check_sign_in
def check_sign_in
unless user_signed_in?
redirect_to signin_path
end
private
def current_user
begin
@current_user ||= User.find(session[:user_id]) if session[:user_id]
rescue Mongoid::Errors::DocumentNotFound
nil
end
end
def user_signed_in?
return true if current_user
end
我有routes.rb
我对signin_path
match '/signin' => 'sessions#new', :as => :signin
我的sessions#new
操作如下所示
def new
redirect_to '/auth/facebook'
end
手头的问题虽然是这样的,但我得到一个重定向循环错误,其读取如下
此网页有重定向循环
http://localhost:3000/signin的网页导致了太多的重定向。清除此站点的cookie或允许第三方cookie可以解决问题。如果没有,则可能是服务器配置问题,而不是计算机问题。
这似乎很可能是因为facebook的登录过程中还有一个回调,我怀疑是什么导致循环。是否有更好的方法来确保用户被记录或采用其他方法来实现我的想法?
我目前正在使用
Rails 3.1.3,
Ruby 1.9.3,
omniauth-facebook 1.2.0,
omniauth 1.0.2
答案 0 :(得分:5)
在SessionsController中,您需要添加skip_before_filter :check_sign_in, :only => [:new, :create]
。
在没有条件的情况下在ApplicationController中添加before_filter意味着每个从它继承的控制器中的每个操作也将被重定向,因此永远不会调用实际的会话操作。
您可能还需要跳过OmniAuthCallbackController中的before_filter,具体取决于它是否也从ApplicationController继承。