2009-05-21 43 views
0

我一直在敲我的頭這一個,現在一兩天:回報率:AuthenticatedSystem無法正常重定向回野生動物園

我使用AuthenticatedSystem要求對某些資源的認證得到了回報率的應用程序。 before_filter檢查用戶是否已登錄。如果不是,則抓取request.request_uri並將其放入會話變量(session [:return_to])中,然後通過302重定向消息將用戶發送到登錄頁面。然後登錄後,用戶被重定向回session [:return_to]中的url。

這在IE和Firefox中很適用。在Safari中,初始的before_filter上的request.request_uri爲空,會話控制器總是重定向到主頁面。

有沒有人遇到過這個?我唯一的線索是Safari的Web Inspector甚至不會顯示初始頁面的請求,只顯示登錄請求。在Firefox中,我看到了這兩個請求。

這裏的的before_filter:

def login_required 
    if !authorized? 
    session[:return_to] = request.request_uri 
    redirect_to new_session_path 
    end 
end 

這裏的會話/創建:

def create 
    self.current_user = User.authenticate(params[:login], params[:password]) 
    if logged_in? 
    if params[:remember_me] == "1" 
     current_user.remember_me unless current_user.remember_token? 
     cookies[:auth_token] = { :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at } 
    end 
    redirect_back_or_default('/') 
    flash[:notice] = "Logged in successfully" 
    else 
    flash.now[:error] = "Authentication failed." 
    render :action => 'new' 
    end 
end 

任何想法?

回答

0

所以,以防萬一有人碰到這個運行...

答案似乎是在Safari瀏覽器的第三方Cookie的攻擊性阻塞。這個錯誤發生在一個小書籤中,當用戶決定使用它時,它基本上是一個添加到第三方網站的DOM中的iframe(不用擔心,它與FriendFeed的小書籤類似 - 基本上是用戶添加內容的一種方式從其他網站沒有離開這些網站)。

無論如何,在這種情況下,Safari會將Rails嘗試設置爲第三方的會話Cookie視爲第三方,即使它是從iframe中設置的。所以,重定向時,所有會話變量都將丟失。

兩個可能的解決方案提出自己

  • 告訴用戶,允許第三方Cookie(不滿意這個選項)
  • 通過「的return_to」 URL與表單數據一起,並在會議上檢索該控制器(更好的選擇)