Django - 具有自定义用户模型的 PermissionRequiredMixin 以及 AUTHENTICATION_BACKENDS
Django - PermissionRequiredMixin with custom user model as well as AUTHENTICATION_BACKENDS
我正在使用 Django 1.9。当我尝试将 PermissionRequiredMixin 添加到基于 class 的视图时,它似乎没有按预期工作。我在 auth_group 中创建了一个新用户。此 auth_group 没有任何应用程序或模型的权限。这个新用户不是超级用户或管理员用户。但是该应用程序不会阻止此用户访问需要 permission_required 的特定视图。
首先,这是我试图确保用户没有权限的方法:
user.get_all_permissions() # return set() - empty permission, which is correct.
user.is_superuser # return false, which is correct.
user.has_perm('myapp.add_something or even any words that make no sense') # always return true, which is very weird.
该应用程序具有自定义用户模型,并且还使用 django-allauth 作为 AUTHENTICATION_BACKENDS。我不确定 PermissionRequiredMixin 是否会检查 user.has_perm() 并且它总是 return true 所以这就是检查权限不能按预期工作的原因?
# views.py
class My_View(PermissionRequiredMixin, View):
permission_required = 'polls.can_vote'
def get(self, request, *args, **kwargs):
# do something...
return render(request, "template.html", {})
# models.py - Custom User Model
class CustomUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(
verbose_name='email address',
max_length=255,
unique=True,
)
group = models.ManyToManyField(Group, through='UserGroupRelationship')
....
# models.py - many-to-many relationship between user and group
class UserGroupRelationship(models.Model):
user = models.ForeignKey("CustomUser")
user_group = models.ForeignKey(Group)
我也在 urls.py 中尝试了检查权限的旧方法。它也不会阻止用户访问,所以我认为这不是使用 PermissionRequiredMixin 的问题。
urlpatterns = patterns('',
(r'^vote/', permission_required('polls.can_vote')(VoteView.as_view())),
)
在这个问题上折腾了几天,终于找到原因了。
当我查看有关 PermissionRequiredMixin 的源代码时,我发现 PermissionRequiredMixin 确实检查了 user.has_perm()。当我试图找到 has_perm() 的源代码时,我发现我的代码(从 Django's document 的自定义用户模型示例中复制而来)包含以下重写方法...
def has_perm(self, perm, obj=None):
"Does the user have a specific permission?"
# Simplest possible answer: Yes, always
return True
这就是为什么 user.has_perm('anything') 总是 return true 的原因,这也影响了 PermissionRequiredMixin 的功能。因此,如果您是 Django 的新手并尝试从文档中复制一些示例代码,则需要非常小心每一行...
我正在使用 Django 1.9。当我尝试将 PermissionRequiredMixin 添加到基于 class 的视图时,它似乎没有按预期工作。我在 auth_group 中创建了一个新用户。此 auth_group 没有任何应用程序或模型的权限。这个新用户不是超级用户或管理员用户。但是该应用程序不会阻止此用户访问需要 permission_required 的特定视图。
首先,这是我试图确保用户没有权限的方法:
user.get_all_permissions() # return set() - empty permission, which is correct.
user.is_superuser # return false, which is correct.
user.has_perm('myapp.add_something or even any words that make no sense') # always return true, which is very weird.
该应用程序具有自定义用户模型,并且还使用 django-allauth 作为 AUTHENTICATION_BACKENDS。我不确定 PermissionRequiredMixin 是否会检查 user.has_perm() 并且它总是 return true 所以这就是检查权限不能按预期工作的原因?
# views.py
class My_View(PermissionRequiredMixin, View):
permission_required = 'polls.can_vote'
def get(self, request, *args, **kwargs):
# do something...
return render(request, "template.html", {})
# models.py - Custom User Model
class CustomUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(
verbose_name='email address',
max_length=255,
unique=True,
)
group = models.ManyToManyField(Group, through='UserGroupRelationship')
....
# models.py - many-to-many relationship between user and group
class UserGroupRelationship(models.Model):
user = models.ForeignKey("CustomUser")
user_group = models.ForeignKey(Group)
我也在 urls.py 中尝试了检查权限的旧方法。它也不会阻止用户访问,所以我认为这不是使用 PermissionRequiredMixin 的问题。
urlpatterns = patterns('',
(r'^vote/', permission_required('polls.can_vote')(VoteView.as_view())),
)
在这个问题上折腾了几天,终于找到原因了。
当我查看有关 PermissionRequiredMixin 的源代码时,我发现 PermissionRequiredMixin 确实检查了 user.has_perm()。当我试图找到 has_perm() 的源代码时,我发现我的代码(从 Django's document 的自定义用户模型示例中复制而来)包含以下重写方法...
def has_perm(self, perm, obj=None):
"Does the user have a specific permission?"
# Simplest possible answer: Yes, always
return True
这就是为什么 user.has_perm('anything') 总是 return true 的原因,这也影响了 PermissionRequiredMixin 的功能。因此,如果您是 Django 的新手并尝试从文档中复制一些示例代码,则需要非常小心每一行...