如何在自定义用户模型中使用 django-guardian
How to use django-guardian in customized user model
我正在使用 django-guardian 检查用户的对象权限。在我的特殊情况下,我扩展了用户模型。
在我的 models.py 中,我扩展了这样的用户模型:
enter image description here
class User(AbstractBaseUser):
email = models.EmailField(
verbose_name='email address',
max_length=255,
unique=True,
)
active = models.BooleanField(default=True)
staff = models.BooleanField(default=False)
admin = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = [] # Email & Password are required by default.
def get_full_name(self):
# The user is identified by their email address
return self.email
def get_short_name(self):
# The user is identified by their email address
return self.email
def __str__(self): # __unicode__ on Python 2
return self.email
def has_perm(self, perm, obj=None):
"Does the user have a specific permission?"
# Simplest possible answer: Yes, always
return True
def has_module_perms(self, app_label):
"Does the user have permissions to view the app `app_label`?"
# Simplest possible answer: Yes, always
return True
@property
def is_staff(self):
"Is the user a member of staff?"
return self.staff
@property
def is_admin(self):
"Is the user a admin member?"
return self.admin
@property
def is_active(self):
"Is the user active?"
return self.active
并且在我的对象模型中,我添加了一个 Meta class 权限:
enter image description here
class task(models.Model):
name = models.CharField(max_length=100)
class Meta:
permissions = (
('view_task', 'View task'),
)
def __str__(self):
return self.name
完成 makemigrations 和 migrate 后,当我 运行 在 python manage.py shell 中进行下面的测试时,它总是在我的用户中调用 has_perm 函数model 和 returns 该函数的值,为 True。
>>>from myapp.models import User, task
>>>setuser = User.objects.get(email = 'joe@gmail.com')
>>>task = exclusionDomain.objects.get(name = 'task1')
>>>setuser.has_perm('view_task', task)
如何解决这个问题?或者有没有关于如何在自定义用户模型中使用监护人的有用教程?
如果有人遇到同样的问题。这是解决方案:
不使用 AbstractBaseUser,而是使用 AbstractUser。 AbstractBaseUser 与 django-guardian 不兼容。根据监护人文档,使用 AbstractUser 的扩展用户模型应该没问题。它也对我有用。
这里是使用AbstractUser扩展用户模型的教程:
https://wsvincent.com/django-custom-user-model-tutorial/
我正在使用 django-guardian 检查用户的对象权限。在我的特殊情况下,我扩展了用户模型。 在我的 models.py 中,我扩展了这样的用户模型: enter image description here
class User(AbstractBaseUser):
email = models.EmailField(
verbose_name='email address',
max_length=255,
unique=True,
)
active = models.BooleanField(default=True)
staff = models.BooleanField(default=False)
admin = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = [] # Email & Password are required by default.
def get_full_name(self):
# The user is identified by their email address
return self.email
def get_short_name(self):
# The user is identified by their email address
return self.email
def __str__(self): # __unicode__ on Python 2
return self.email
def has_perm(self, perm, obj=None):
"Does the user have a specific permission?"
# Simplest possible answer: Yes, always
return True
def has_module_perms(self, app_label):
"Does the user have permissions to view the app `app_label`?"
# Simplest possible answer: Yes, always
return True
@property
def is_staff(self):
"Is the user a member of staff?"
return self.staff
@property
def is_admin(self):
"Is the user a admin member?"
return self.admin
@property
def is_active(self):
"Is the user active?"
return self.active
并且在我的对象模型中,我添加了一个 Meta class 权限: enter image description here
class task(models.Model):
name = models.CharField(max_length=100)
class Meta:
permissions = (
('view_task', 'View task'),
)
def __str__(self):
return self.name
完成 makemigrations 和 migrate 后,当我 运行 在 python manage.py shell 中进行下面的测试时,它总是在我的用户中调用 has_perm 函数model 和 returns 该函数的值,为 True。
>>>from myapp.models import User, task
>>>setuser = User.objects.get(email = 'joe@gmail.com')
>>>task = exclusionDomain.objects.get(name = 'task1')
>>>setuser.has_perm('view_task', task)
如何解决这个问题?或者有没有关于如何在自定义用户模型中使用监护人的有用教程?
如果有人遇到同样的问题。这是解决方案:
不使用 AbstractBaseUser,而是使用 AbstractUser。 AbstractBaseUser 与 django-guardian 不兼容。根据监护人文档,使用 AbstractUser 的扩展用户模型应该没问题。它也对我有用。
这里是使用AbstractUser扩展用户模型的教程: https://wsvincent.com/django-custom-user-model-tutorial/