13

最后一件事我对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 版本,这可能吗?

4

2 回答 2

8

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

值得注意的第一件事是,与仅呈现 JSON 相比,可浏览 API 不会为您的用户提供更多权限。它只是对 API 端点的一个更好的视图。就个人而言,我通常希望将可浏览的 API 公开给最终开发人员,因为它使针对 API 的开发变得更加容易。

如果您确实想对除管理员用户之外的所有人隐藏它,您可以采取以下两种方法:

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

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

于 2013-02-15T13:19:24.407 回答
1

我认为它按照文档中的描述工作:

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

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

于 2013-02-15T13:56:54.530 回答