Django REST权限类和身份验证类之间的区别

时间:2013-02-14 17:19:49

标签: django django-rest-framework

最后一件事我对Django Rest Framework感到困惑,而且在权限类和身份验证类之间存在差异

这是我的settings.py

REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAdminUser',


),
'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.TokenAuthentication',
    'rest_framework.authentication.SessionAuthentication',
),
'PAGINATE_BY': 10

}

在我看来,我有以下内容......

class ProfileList(generics.ListCreateAPIView):
    """
    API endpoint that represents a list of users.
    """
    permission_classes = (permissions.IsAdminUser,)
    model = Profile
    serializer_class = ProfileSerializer

    def pre_save(self, obj):
        obj.owner = self.request.user

我认为上面会发生的是,只有管理员用户才能访问可浏览的API,而具有有效令牌的用户仍然可以获得json请求。但是,情况并非如此,只有IsAuthenticated似乎给他们访问但= =这仍然允许我的用户在登录时访问在线版本。

我希望所有拥有有效令牌的用户都能获得访问权限,但只有管理员用户才有权使用会话查看在线API版本,这可能吗?

2 个答案:

答案 0 :(得分:6)

  

我希望所有拥有有效令牌的用户都能获得访问权限,但只有管理员用户才有权使用会话查看在线API版本,这可能吗?

首先要注意的是,如果您只渲染到JSON,可浏览的API将不会为您的用户提供任何更多的权限。它只是对API端点更好的视图。就个人而言,我通常希望将可浏览的API暴露给最终开发人员,因为它使得针对API的开发变得更容易。

如果您确实想要将其隐藏起来,除了管理员用户之外,您可以采取以下两种方法:

  1. 覆盖视图上的get_renderers()方法。 (简要记录here) 您可以检查self.request.user.is_staff,如果是管理员用户,则只包含可浏览的API呈现器。

  2. 对可浏览的API呈现器进行子类化,并覆盖.render()。 (例如,请参阅here)您可以使用renderer_context['request']获取传入请求,如果不是管理员用户,则只需渲染为标准JSON。

答案 1 :(得分:1)

我认为它的工作原理如the docs

所述
  

如果任何权限检查失败,则会引发exception.PermissionDenied异常,并且视图的主体将不会运行。

如果您设置IsAdminUser,则该用户必须是管理员。否则,即使提供了DEFAULT_AUTHENTICATION_CLASSES中所需的所有内容,他也不会获得许可。