2011-01-06 67 views
4

我有設計用戶和管理員的單獨模型。我也使用Basecamp風格的子域名。除了一些控制器和操作,我需要能夠以用戶身份或管理員身份進行身份驗證之外,一切運行良好。設計與用戶或管理模型和Basecamp樣式子域名登錄

當前我有authenticate_user!在我的application_controller.rb中設置,我跳過skip_before_filter這些控制器和只有管理員應該有權訪問的操作。

不幸的是,我不能簡單地在每個控制器上指定驗證要求,因爲我仍然需要一些控制器和操作來由用戶或管理員訪問。

我已經嘗試了幾件事情無濟於事。看來,如果我移動authenticate_user!和authenticate_admin!成某種子域檢測邏輯,它無法處理。基本上是:

current_subdomain = request.subdomains.first  
if current_subdomain == 'admin' 
authenticate_admin! 
else 
authenticate_user! 
end 

我,在一個點上,能夠得到它試圖認證,但由於某種原因,它無法從需要這導致重定向循環(先爲我的認證,除了會話控制器紅寶石!)。

我意識到,我可以一個字段添加到我的用戶是管理員指地位,但應用程序需要用戶和管理員之間的權力比更大的分離將允許,除了少數控制器和動作。

  • 的Ruby 1.9.2
  • 的Rails 3.0.3
  • 設計1.1.3

回答

13

嘗試編寫自己的過濾器之前沿着噸他的

#application_controller.rb 
def authenticate_any! 
    if admin_signed_in? 
     true 
    else 
     authenticate_user! 
    end 
end 

線,然後在你想同時管理員和用戶能夠擁有通過認證使用

#myobject_controller.rb 
before_filter :authenticate_any! 

如果您已經登錄作爲一個管理員權限的控制,那麼你將通過before_filter,否則你將通過authenticate_user!這是默認行爲。

10

其實這不起作用:

#application_controller.rb 
def authenticate_any! 
    if admin_signed_in? 
     true 
    else 
     authenticate_user! 
    end 
end 

將開始驗證用戶無限遞歸..

,而不是嘗試這個辦法:

def authenticate_user! 
    return if admin_signed_in? 
    super 
end 

只要記住,這個第二解決方案您是這樣說的: '您必須至少以用戶' 登錄,並且您將失去認證僅限用戶使用。

管理員將能夠訪問所有。