2012-08-27 48 views
2

我可以獨立配置:database_authenticatable:ldap_authenticatable;第一個針對我的Rails SQLite開發數據庫進行身份驗證,另一個針對我公司的LDAP/Active Directory服務器進行身份驗證。堆棧database_authenticatable和ldap_authenticatable與設計

我想現在能夠做的是將兩個認證進行疊加。如果用戶通過數據庫驗證,那麼很好;如果不是,那麼檢查LDAP(並最終創建用戶)。我已經嘗試了很明顯的:

devise :database_authenticatable, :ldap_authenticatable, :rememberable, :trackable 

用戶首先驗證對預期的數據庫:

User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."login" = '[email protected]' LIMIT 1 

查詢返回的用戶[email protected]「一行(忽略電子郵件字段差異的登錄列)。問題是devise然後繼續失敗的LDAP認證。我如何告訴devise接受第一個成功的認證策略並在那裏停止?

回答

2

我意識到這是一個古老的問題,但它出現在Google搜索中,因此我會爲其他可能會遇到它的人回答。

我不認爲有可能通過一個用戶模型來做兩種類型的認證。我已經完成的方式是在用戶模型上使用Single Table Inheritance。

class User < ActiveRecord::Base 
end 

class LdapUser < User 
    devise :ldap_authenticatable, :rememberable, :trackable 
end 

class LocalUser < User 
    devise :database_authenticatable, :registerable, :confirmable, :recoverable, :trackable 
end 

只有User在數據庫中創建的,但它與所有存在於繼承模型的字段創建。它還需要一個額外的列type這是一個字符串。這允許Rails/ActiveRecord推斷模型和繼承結構,並使其正常工作。

之後,您可以設置設計以提供每個模型所需的路線。但是,這會產生兩個登錄表單。用戶不必知道他們是什麼類型的用戶,所以最好將這些用戶組合成一個系統。

我問起這個以前是一個問題,但最終設法制定出一個解決方案,所以我建議你閱讀我的回答這個問題:https://stackoverflow.com/a/21175515/166210