【问题标题】:Django permission's specific to templateviewDjango 权限特定于模板视图
【发布时间】:2021-02-10 23:35:21
【问题描述】:

如何创建多个权限类来限制用户访问模板视图(不使用任何模型)。 例如:我有 4 个用户类别——(管理员、管理、校长、教师)。我有一个管理仪表板模板视图,应该限制为用户类型=管理员。

我希望能够编写多个权限类,然后我可以在任何视图中组合使用它们。

以下代码生成 403 错误:

class AdministratorPermission(AccessMixin):
    def has_permission(self):
        return True


class GeneralPerm1(AccessMixin):
    def has_permission(self):
        return True


class DashboardView(PermissionRequiredMixin,
                    LoginRequiredMixin, TemplateView):
    template_name = 'administrator/dashboard.html'
    permission_required = (AdministratorPermission,GeneralPerm1)

有没有办法做类似DRF 权限的事情。

谢谢

【问题讨论】:

  • 是什么让你认为这应该显示一个页面?您交给permission_required 的课程不是权限。看起来您认为因为 has_permission() 为这些类返回 True,所以任何人都应该能够查看该页面。

标签: django django-views permissions


【解决方案1】:

Permission1Mixin.py:

from django.contrib.auth.mixins import AccessMixin
from django.core.exceptions import PermissionDenied

class IsAdministratorMixin(AccessMixin):
    """ if user is not administrator, decline permission """

    def dispatch(self, request, *args, **kwargs):
        """
        if user is authenticated and administrator
            we are good. otherwise permission denied
        """
        if request.user.is_authenticated and \
                request.user.category.category == \
                UserCategoryEnum.ADMINISTRATOR.value:
            return super().dispatch(request, *args, **kwargs)

        raise PermissionDenied('Permission denied')  # decline permission

view.py

class DashboardView(IsAdministratorMixin, TemplateView):
    template_name = 'administrator/dashboard.html'

这样我们可以创建多个独立的权限混合并组合使用。

【讨论】:

  • 它们不是权限混合,而是从它们继承的类中可以看到的 AccessMixin。 Permissions 一方面与模型相关联,另一方面与用户或组相关联。 Access Mixins 用于这种情况,其中访问它不依赖于基于模型的权限。您通常会使用 UserPassesTestMixin 执行此操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
  • 2019-06-12
  • 2019-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
相关资源
最近更新 更多