2013-02-14 135 views
5

我还有一点与有点混淆,那就是权限类别和认证类别之间的不同。Django REST在权限类别和认证类别之间的区别

这是我的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,而仍然拥有有效令牌的用户可以使用g et json请求。但是,这不是唯一的情况是IsAuthenticated似乎给他们访问,但=这并仍然允许我的用户在登录时访问在线版本。

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

回答

6

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

第一件值得注意的事情是,可浏览的API不会给你的用户更多的权限,如果你只是渲染到JSON,它们会有更多的权限。这只是一个更好的API端点视图。就我个人而言,我通常希望将可浏览的API公开给最终开发人员,因为它可以更轻松地进行API开发。

如果你确实想从每个人都隐藏在这里,除了管理员用户您可以采取两种方法:

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

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

1

我觉得它工作在the docs描述:

如果任何许可检查失败的exceptions.PermissionDenied将引发异常,并且视图的主体将无法运行。

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