2015-10-20 31 views
3

我已經實現了我自己的User模型類,如下所示。請注意,它是不是定製django的auth.User模型。我對這個對象的權限知識很陌生,特別是在我的項目中需要的這個自定義用戶模型中。您自己的用戶模型的Django Per Object權限

你可以舉一個例子,在這種情況下添加每個對象的權限?非常感激。

from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin 

class CustomUser(AbstractBaseUser, PermissionsMixin): 
     email = models.EmailField(max_length=40, unique=True) 
     //.... other fields are omitted 

class Article(models.Model): 
    title = models.CharField('title', max_length=120) 
    body = models.TextField('body') 
    author = models.ForeignKey(CustomUser) 

現在,對象權限開始發揮作用。每個用戶都可以創建/更新/刪除/查看他們自己的文章對象,但只有在沒有更新/刪除權限的情況下才能查看他人的文章。

從django文檔中,模型級別權限不適用於此處。如果文章具有模型級別更新權限,則所有用戶都可以更新他人的文章。

因此,我發現了django-guardian。然而,這個自定義的CustomUser模型似乎沒有希望,因爲它很大程度上依賴於Django的auth.User模型!

https://django-guardian.readthedocs.org/en/v1.2/userguide/custom-user-model.html

UPDATE:

  1. 我的情況下繼承,而不是AbstractUser AbstractBaseUser;
  2. 這不是爲管理員,但只爲我的後端代碼邏輯;
  3. 這裏我沒有使用Django REST API,但是如果REST API是正確的,請舉個例子。
+0

您是否正在使用Django Rest Framework?或者僅僅是Django? – user2719875

+0

您是否希望將此集成到Django管理員中,還是僅用於您自己的代碼中? – oogles

+0

在更新中回答。 – coder

回答

8

即使使用標準的auth.User模型,對象級權限也不會內置到Django中。但是基礎在於Django的PermissionsMixin定義了has_perm方法,它接受模型實例。 Django默認不做任何事,但你可以。

has_perm方法有效地將艱苦的工作傳遞到註冊的認證後端。因此,您可以創建一個專門用於執行對象級權限檢查的自定義身份驗證後端。它不需要實際處理認證。它可以像一個基本類的單一方法一樣簡單。像下面的(未經測試)的東西是你應該需要:

class ObjectPermissionsBackend(object): 

    def has_perm(self, user_obj, perm, obj=None): 
     if not obj: 
      return False # not dealing with non-object permissions 

     if perm == 'view': 
      return True # anyone can view 
     elif obj.author_id == user_obj.pk: 
      return True 
     else: 
      return False 

告訴Django使用AUTHENTICATION_BACKENDS設置爲使用自定義的後端。在設置中。潘岳:

AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend', 'path.to.ObjectPermissionsBackend') 

然後,在你的代碼:

if user.has_perm('edit', article_instance): 
    # allow editing 

https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#custom-users-and-permissionshttps://docs.djangoproject.com/en/1.8/topics/auth/customizing/#specifying-authentication-backends

+0

感謝您的回答。我也在尋找一些能夠做到這一點的軟件包。 – coder

+0

在這種情況下,[@ schneck's answer](http://stackoverflow.com/a/33229986/405174)應該可以工作。我沒有使用過django-guardian,但是你給出的鏈接似乎表明你可以用你自己定製的User模型來使用它,它只是警告它需要一個多對多的關係, User''模型和''auth.Group''模型。 Django的''PermissionsMixin'',你已經在使用,定義了這種關係。你是否看到一個試圖在模型中使用django-guardian的特定錯誤? – oogles

+0

django-guardian涉及創建對象並難以使用。但它很強大,你有一個簡單的例子嗎?他們的示例項目沒有公開很多功能。所以,我想出了一些其他的軟件包來使用。 – coder

0

在您發佈的documentation page,還指出:

基本上,如果我們繼承AbstractUser或定義許多一對多關係 與auth.Group(並給反向相關名稱組)我們應該是 罰款。

因爲這是你在做什麼,你應該設置AUTH_USER_MODEL如寫在Django documentention(見the ticketcommit code Django的1.5兼容)。

+0

謝謝,但我的情況是AbstractBaseUser而不是AbstractUser。他們是不同的。 – coder

0

我結束了使用基於每個對象的權限邏輯,這樣它不會改變我的數據庫。這是支持我的基於類的視圖的django-rules。請記住重寫redirect_field_name,否則,如果用戶登錄,最終會出現重定向循環。