2016-01-25 45 views
0

我正在將權限功能實現到我的webapp中。客戶指定的要求是用戶可以根據他們是什麼類型的用戶來執行某些操作。用戶的種類基於user_type:user_role的組合來定義。這是模型:Django:從user_type派生權限

class User(AbstractUser): 

    usertype = models.IntegerField(choices=UserType.CHOICES, default=UserType.BUYER_USER) 
    role = models.IntegerField(choices=UserRole.CHOICES, default=UserRole.NORMAL_USER) 

例如,我們可以有:

  • adviser:regular:可以manager_orders
  • adviser:admin:可以做一個adviser:regular做什麼,也manage_advisers(這是沒有Django的admin,但)

(還有更多user_type:user_role

這似乎與django permission system,這是基於什麼權限的用戶具有,而不是什麼樣的用戶是衝突。

也就是說,當使用django權限系統時,我需要定義所有可能的權限並將這些權限分配給受影響的用戶。相反,用我正在計劃的方法,我需要user_type:user_role派生的許可。

在這種情況下使用django權限系統有意義嗎?我如何獲得user_type:user_role的許可

+2

那麼,如果可能的話,爲什麼不使用django'groups'概念開始呢?您可以創建一個組併爲該組分配一定的權限,然後組中的所有用戶都將繼承該權限。在這種情況下,可以通過檢查他/她所屬的組來回答「是什麼類型的用戶」這個問題。 –

+0

@尚王:謝謝,但仍不清楚。我仍然可能(有可能)衝突的信息:一方面是user_type:user_role,另一方面是用戶所屬的組。由於該組是決定性參數,因此user_type:user_role不相關。這正是我想避免的:我想直接從user_type:user_role派生權限,而不是從任何其他設置(權限或組)中獲得權限 – dangonfast

+0

我的建議並不真正適用於您的模型,它是一種替代方法這比django更適合你的原始設計。我真的不知道你怎麼能用自己的方式來使用權限系統(但肯定是自定義的),但是你可能會發現使用group來表示'usertype'和'role'更容易。 –

回答

1

如果你不想在評論中堅持@ShangWangs的做法,我會建議看看Django Object Based Permissions。 通過這種方式,您可以爲用戶授予從您想要應用權限的超級模型派生的對象的權限。

1

每Django文檔,你可以用自定義認證後端做到這一點:
https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#handling-authorization-in-custom-backends

任何時候的Django需要檢查用戶是否有將委託給AUTH後端一個特定的權限,使電流用戶對象作爲參數。此時您可以檢查usertyperole字段並返回適當的布爾值。從文檔

例如:

class SettingsBackend(object): 
    ... 
    def has_perm(self, user_obj, perm, obj=None): 
     if user_obj.username == settings.ADMIN_LOGIN: 
      return True 
     else: 
      return False 

從你在你的問題描述一下你並不需要的「對象級的權限併發症如其他人所說(因爲你沒有獨特的權限每個用戶,他們都是基於類型和角色)

+0

謝謝,有趣。但在@ShangWang發表評論後,我覺得將我的「user_types」定義爲組是非常容易的。我甚至不需要定義一個user_type,因爲它隱含在組中。 – dangonfast