Python 在序列化程序Django rest framework中进行权限检查,
我是一个相当新的django rest框架,我对权限有一些疑问 所以我有一个用户,他是组织的成员和某个组的成员。 假设我们有一个模型:Python 在序列化程序Django rest framework中进行权限检查,,python,django,django-rest-framework,django-permissions,django-serializer,Python,Django,Django Rest Framework,Django Permissions,Django Serializer,我是一个相当新的django rest框架,我对权限有一些疑问 所以我有一个用户,他是组织的成员和某个组的成员。 假设我们有一个模型: class SomeModel: organization = models.ForeignKey(Organization) name = models.CharField() 用户只能为自己的组织创建/更新某个模型,如果他是一组“协调员”,他还可以为任何组织创建/更新 目前,我的方法是在序列化程序中的.create()和.update()方
class SomeModel:
organization = models.ForeignKey(Organization)
name = models.CharField()
用户只能为自己的组织创建/更新
某个模型
,如果他是一组“协调员”,他还可以为任何组织创建/更新
目前,我的方法是在序列化程序中的.create()
和.update()
方法中检查这些条件,因为数据已经过验证,我正在那里引发PermissionDenied
错误。但感觉这不是“正确的方式”。我尝试创建一个自定义权限类,但由于在序列化程序之前检查了权限类,因此数据没有得到验证。
你有什么建议我该怎么做
对不起,英语不好,这不是我的母语。
谢谢
编辑:
例子:
请求数据类似于:
payload = {'organization': 1, 'name': 'Name'}
因此,如果用户来自组织1或他是协调员,则应授予访问权限,并应创建
SomeModel
您可以编写自定义权限类HasWritePermissions
,该类将检查用户是否具有写入/更新权限
要创建,您需要重写BasePermission
类并实现has\u permission()
方法。如果请求被授予访问权限,则此方法应返回True
,否则返回False
class HasWritePermissions(BasePermission):
def has_permission(self, request, view):
# grant access to non-create/update requests
if request.method not in ['POST', 'PUT', 'PATCH']:
return True
# grant access if user is a member of organization of the object
# to be modified or is a coordinator
if (organization in user.organizations) or (user_is_a_coordinator):
return True
# Otherwise don't grant access
return False
使用自定义权限类时,如果用户没有创建/更新权限,为什么要进一步验证数据?我需要检查正在创建的模型中的组织是否存在。我添加了一个示例,这可能有助于理解我的问题…为了检查对象的组织,必须首先验证请求数据吗?或者如何获取当前正在创建的对象?是的,要使用此方法处理创建/更新,您必须使用组织对象的id执行查找,并检查其是否位于用户的组织中。但如果请求负载中不存在组织字段,或者数据库中不存在组织id,该怎么办。这将导致一些不必要的状态500错误。。。我可以检查所有这些东西,但这就是序列化程序和验证器的用途?您应该在用户组织id列表中执行类似于,
request.data.get('organization\u id')的操作,或者在user
模型上为相同的对象编写一个模型方法is\u organization\u member(organization\u id)
。您将使用request.data.get()
传递organization\u id
值,该值可以是None
或某些值。然后,您可以检查该值是否在用户的组织
ID列表中。您不必担心organization\u id
字段是否存在或是否为有效值。同意,序列化程序应验证数据,但根据用例,如果“有效”的organization\u id
不在用户的organizations id列表中,则不应授予请求访问权限。应在权限级别停止此类请求。如果organization\u id
无效,您可以让请求通过,DRF序列化程序应该返回400个错误。(是的,在某种程度上,这包括一些重复。)