2013-12-18 25 views
1

我有如下表:設計:如何驗證與其他模型有關係的用戶?

users 
====== 
id 
email 
password 
..device columns.. 

providers 
========== 
user_id 
..irreverent columns.. 

consumers 
========== 
user_id 
..irrelevant columns.. 

消費者和供應商都屬於users表,我們採用這樣的設計,因爲有網絡應用程序,雙方都可以訪問的地方,但是,有時會出現是消費者不應該在的提供商特定領域,例如提供商管理面板。

因此,這提出了以下問題,當我們只知道用戶表而不知道提供者/消費者時,我如何才能讓Devise只驗證提供者而不是提供者特定命名空間的消費者?

這裏就是我想應該做的:

控制器/供應商/ base_controller.rb:

before_action :authenticate_provider! 

    private 
    #A modified wrapper around authenticate_user! 
    def authenticate_provider! 
    authenticate_user! 
    redirect_to sign_in_path unless Provider.find_by(user: current_user) 
    end 
+0

小心這些不敬的專欄 – Slicedpan

+1

更嚴重的問題是,您提出的解決方案有什麼問題? – Slicedpan

+0

@Slicedpan其實並沒有什麼,我只是期待一個更優雅的解決方案,或許是Devise開箱即用的功能。 – Abdulaziz

回答

1

你可能想有幾件事情要考慮:

  1. 您可以爲用戶表創建角色屬性,而不是爲提供者和使用者使用單獨的表。該設計似乎更適合您的需求。

  2. 如果要根據用戶是提供者還是用戶來限制對站點某些部分的訪問,那麼這是您需要的授權而不是身份驗證。假設你已經有一個角色屬性爲用戶,你可以有像下面的代碼你不希望消費者能夠訪問一個控制器動作:

def new 
    redirect_to root_path, alert: "Unauthorized access." if current_user.role == "consumer" 
end 

讓我知道如果有幫助。

+1

準備發佈這個 - 你之後是授權,而不是驗證。只需對用戶進行身份驗證,忽略他們的特定角色,然後在您希望限制的控制器操作的before_filter中檢查current_user的角色。 – gregates

相關問題