2013-12-17 113 views
1

我正在開發一個Django項目,該項目將把公司作爲客戶端,並允許每個客戶端創建多個用戶。然後可以爲這些用戶分配不同的權限或角色。不同客戶端的Dj​​ango權限

美中不足之處在於權限的類型與客戶即改變它們沒有讀那麼簡單,寫,刪除。因此,一個客戶端可以只有5-10種類型的權限,而另一個可以有100個。

內置的Django的權限框架不直接支持我的用例,所以這是我想出了:

  1. 創建一個主Django應用程序裏面有用戶模型
  2. 對於每一個新客戶,創造只有新的Django應用程序的models.py
  3. 的models.py只有一個模型(暫時),這本身設有專用於該客戶端的權限解釋here
  4. 現在我可以根據用戶屬於哪個客戶端來分配每個用戶的權限。

雖然我沒有測試它,這應該工作。該解決方案看起來具有可擴展性,但存在很多不一致之處,而且似乎並不是正確的方式。有沒有解決辦法?

更新:django-guardian看起來像它可以幫助,不知道如何。

更新:我想我會解釋整個架構,因爲當前的解決方案並沒有爲它直接工作。

  1. 有時間序列數據流,數據以固定間隔進入。每個客戶端可以有100到1000多個這樣的流。這些流不會保存在Web服務器數據庫中,但會保存在每個客戶端不同的數據庫中。
  2. 現在,用戶可以擁有查看全部,一個或部分上述流的權限。客戶讓我們知道他們想要創建的用戶類型,並相應地創建一個。
  3. 出於身份驗證的目的,最好讓所有用戶都在一張表中。但是對於授權,每個客戶端用戶都在一個單獨的表上是有意義的。在我看來,最好是隔離客戶。
  4. 稍微偏離主題,但我們正在尋找在提供每個客戶一個單獨的合作領域一樣client1.mysite.com,client2.mysite.com等,因此我們可以自由地部署不同的Web服務器爲每個客戶,因此爲每個客戶定製它。此外,這有助於以不同方式存儲每個客戶用戶的數據。

回答

3

我真的不喜歡你的解決方案 - 這是類似於舊數據庫設計中的模式chnges是預計設計!請,不管代價不要做到這一點。遺忘django,40年的數據庫設計讓我們感到數據庫的模式不應該改變(除非當然需求改變你的設計不正確)。我可以提供類似於此的答案:RegEx match open tags except XHTML self-contained tags以強調而不是更改數據庫架構的重要性。

所以,你將有一個Django應用程序,你說裏面有用戶模型和​​模式,這將給一個接口給admininstrator這樣他將添加權限EAH客戶端(管理員將添加權限對於客戶而言,不是開發者)。每個​​將只有一個名稱和一個ForeignKey它適用的客戶端。

現在你可以創建一個UserCustomPermission模式,將會有一個ForeignKeyUser和另一ForeignKey到​​(實際上有User和​​之間的許多一對多的關係。

現在,你需要什麼要實現的是你分配的權限將如何分配給實際允許的和禁止的操作。在你的問題中,你沒有對此做任何說明,只是給你一個方向,我真的很喜歡(並且一直使用) django-rules-light應用程序(https://github.com/yourlabs/django-rules-light)可以用來定義你的bu siness規則。

也許我的答案並不能真正解決您的問題,或者我可能並不瞭解某些內容,但我相信您會得到一個出發點 - 也可以隨時更新您的問題,我會更新我的答案因此。

回答到更新

正如你所瞭解的,我不喜歡1和3:對於每一個新客戶,您將需要創建一個新的數據庫?爲什麼不把所有的客戶端流都放在同一個表中,並使用外鍵來訪問它們所屬的客戶端呢?

(在這裏DRAGONS)

我想到了一個很好的解決方案 - 我不會做,但如果要那麼多把你的用戶和他們在不同的數據庫的權限,那麼你可以使用單獨的子在您的高級域中:使用數據庫路由(https://docs.djangoproject.com/en/1.3/topics/db/multi-db/#database-routers)根據子域選擇每個客戶端的數據庫。所以,你會定義所有客戶的數據庫,你的settings.py:

 
DATABASES = { 
    'default': { 
     'NAME': 'app_data', 
     'ENGINE': 'django.db.backends.postgresql_psycopg2', 
     'USER': 'postgres_user', 
     'PASSWORD': 's3krit' 
    }, 
    'client1': { 
     'NAME': 'client2', 
     'ENGINE': 'django.db.backends.mysql', 
     'USER': 'client2', 
     'PASSWORD': 'priv4te' 
    }, 
    'client2': { 
     'NAME': 'client1', 
     'ENGINE': 'django.db.backends.mysql', 
     'USER': 'client1', 
     'PASSWORD': 'priv4te' 
    } 
} 

然後你將創建一個SubDomainDatabaseRouter類,將使用正確的數據庫根據您的子域名。由於請求設置在該類中不可用,因此必須使用中間件和線程本地語言將它們放在那裏。在下面的代碼片段

https://djangosnippets.org/snippets/2037/

所以看看你的RouterMiddleware您將檢查子站點,並根據您將設置一個client_cfg選項與客戶端的名稱。根據client_cfg,您的SubDomainDatabaseRouter將使用正確的數據庫。要使用它只需添加

DATABASE_ROUTERS = ['my.package.SubDomainDatabaseRouter']

利用這一點,你必須爲每個客戶端完全不同的數據庫。我需要再次強調一下,你會有一個地獄維護它 - 假設你有100個客戶端,並且需要在一個表中添加一個字段。那又怎麼樣?請不要怪我:)

(OF DRAGONS END)

+0

聽,聽!我認爲你的答案應該被接受,因爲這是正確的答案。我想補充的一件事是:管理網站只爲受信任的用戶設計。 Google:「django admin受信任的用戶」。 – allcaps

+0

我更新了我的問題,使其更清楚我正在處理的是什麼。 – vinayakshukl

相關問題