django DRF自定义权限:详细视图的视图级权限

django DRF自定义权限:详细视图的视图级权限,django,django-rest-framework,Django,Django Rest Framework,我不确定如何处理详细视图中的权限(例如api/teams/)。 假设我有一个自定义权限类,如果请求用户在查询的团队中,该类应该允许访问 大致如下: 类IsInTeam(基本权限): def具有_权限(自我、请求、查看): #我是否应该实现这一点? def具有对象权限(自我、请求、查看、团队): 返回团队.hasMember(request.user) 由于具有\u对象\u权限仍被调用(因为“库存”视图在调用获取\u对象时根据以下命令检查权限): 注意:仅当视图级具有权限检查已通过时,才会调用实

我不确定如何处理详细视图中的权限(例如
api/teams/
)。 假设我有一个自定义权限类,如果请求用户在查询的团队中,该类应该允许访问

大致如下:

类IsInTeam(基本权限):
def具有_权限(自我、请求、查看):
#我是否应该实现这一点?
def具有对象权限(自我、请求、查看、团队):
返回团队.hasMember(request.user)
由于
具有\u对象\u权限
仍被调用(因为“库存”视图在调用
获取\u对象
时根据以下命令检查权限):

注意:仅当视图级
具有权限
检查已通过时,才会调用实例级
具有对象权限
方法。还要注意,为了运行实例级检查,视图代码应该显式调用
。检查对象权限(请求,obj)
。如果您使用的是通用视图,则默认情况下将为您处理此问题

现在,根据这一点,
has\u object\u permission
只有在
has\u permission
返回
True
时才会被检查。虽然这是有道理的,但有人可能会争辩说,由于此视图严格基于对由
pk
表示的特定对象的
CRUD
操作,因此可以在
has_permission
方法内执行所有必要的检查


问题是:这是不好的做法吗?若然,原因为何?我能想到的唯一原因是,在
中有_权限
必须检查对象是否存在。这会有点混乱,因为权限检查不必检查对象是否存在。

我认为应该使用两个权限类-“IsAuthenticated”(基本drf权限类)和“IsInTeam”类。在此配置中,将首先调用IsAuthenticated,因此您将确保request.user!=无,在下一步中,IsInTeam拥有\u对象\u权限将检查request.user是否在团队中。您不需要重写has_permission方法,因为它在默认情况下返回True(来自超类)。所以毕竟。。。您的权限类应重写仅具有\u对象\u权限方法。。。。。3行代码:)我知道我应该使用“IsAuthenticated”。为了简单起见,我把它删掉了。问题是。。。当整个视图绑定到一个特定对象时,为什么不检查用户在“has\u permission”中是否有权限?在我看来(大多数情况下)has\u权限方法应该只检查GET/POST(列表和创建),has\u object\u权限GET、PUT、DELETE(检索、更新、删除)因为它依赖于get_对象方法,这是本机GenericViewSet行为。因此,为了简单起见,权限类在许多情况下都应该是可重用的/视图集,其中这些视图集可以只是ModelViewSet,并且它将按照预期使用这些权限类。我同意你的看法。所以has_权限应该只在用户被允许的情况下执行整体检查,而不管他请求的是什么特定项目,因为has_object_权限无论如何都会检查这一点,对吗?对,has_权限可以检查用户是否是管理员,如果viewset需要管理员权限。我认为您应该使用两个权限类-“IsAuthenticated”(基本drf权限类)和“IsInTeam”类。在此配置中,将首先调用IsAuthenticated,因此您将确保request.user!=None,在下一步中,IsInTeam has_object_权限将检查request.user是否在团队中。您不需要重写has_权限方法,因为它默认返回True(来自超级类)。因此,毕竟…您的权限类应该重写只有\u object\u权限方法…3行代码:)我知道我应该使用“IsAuthenticated”“为了简单起见,我把它删掉了。问题是。。。当整个视图绑定到一个特定对象时,为什么不检查用户在“has\u permission”中是否有权限?在我看来(大多数情况下)has\u权限方法应该只检查GET/POST(列表和创建),has\u object\u权限GET、PUT、DELETE(检索、更新、删除)因为它依赖于get_对象方法,这是本机GenericViewSet行为。因此,为了简单起见,权限类在许多情况下都应该是可重用的/视图集,其中这些视图集可以只是ModelViewSet,并且它将按照预期使用这些权限类。我同意你的看法。所以has_permission应该只在用户被允许的情况下执行一次全面检查,而不管他请求的是什么特定项目,因为has_object_permission无论如何都会进行检查,对吗?对,has_permission可以检查用户是否是管理员,如果viewset需要管理员权限。