我有一個Rails應用程序作爲一個OAuth 2.0提供者(使用oauth2-provider寶石)。它存儲所有與用戶有關的信息(賬戶,個人信息和角色)。有2個客戶端應用程序都通過這個應用程序進行身份驗證。客戶端應用程序可以使用client_credentials
授權類型通過電子郵件查找用戶,並執行其他不需要授權代碼的事情。用戶還可以使用密碼授權類型登錄到客戶端應用程序。OAuth2用戶和基於角色的訪問控制
現在我們面臨的問題是用戶的角色是在資源主機上全局定義的。因此,如果在資源主機上爲用戶分配admin
角色,則該用戶在兩個客戶端上都是admin
。我的問題是:我們應該做些什麼來實現更細粒度的訪問控制?即用戶可以是editor
的app1
,但不是app2
。
我想最簡單的方式來做到這一點是改變像這樣的角色名:app1-admin
,app2-admin
,app1-editor
,app2-editor
等更大的問題是:我們是否正確執行這一整個系統;也就是說,我們應該在資源主機上存儲如此多的信息,還是應該將數據非規範化到客戶端應用程序上?
非規範化架構如下所示:資源主機上的所有用戶數據,每個客戶端主機上的本地化用戶數據。因此[email protected]
將在資源主機上擁有他的個人信息,並將其editor
角色存儲在客戶端app1
上。如果他從不使用它,app2
可能完全不知道他的存在。
非規範化模型的缺點是會有大量數據(帳戶ID,角色)和代碼(每個客戶端上的User
和Role
模型,單獨的管理界面等)的重複數據。
保持數據分離有什麼缺點嗎?客戶端應用程序都非常值得信賴 - 我們都是這樣做的 - 但我們很可能會添加額外的客戶端應用程序,這些應用程序將來不在我們的控制範圍之內。
我可以看到這方面的智慧,但想想在多個應用程序中重新實現常見行爲是一個不爭的事實。例如,每個站點都需要一個管理界面來搜索用戶帳戶,分配用戶角色等。由於我們的所有站點都屬於同一個組織(類似於Stackoverflow),因此擁有一個集中的用戶管理界面似乎很有意義。我想我們可以編寫一個gem來爲多個網站添加相同的功能。 – 2012-03-07 15:55:37
@Reed更新一下然後 – 2012-03-07 16:08:33
您可以使用OpenId Connect並在用於實現您的RBAC的JWT使用中將用戶角色作爲聲明返回 – 2017-04-24 15:48:10