序列化器中的权限检查,Django 休息框架,
permissions checking in serializer, Django rest framework,
我是 django rest 框架的新手,我有一些关于权限的问题。
所以我有一个用户是组织成员和某个组的成员。
假设我们有一个模型:
class SomeModel:
organization = models.ForeignKey(Organization)
name = models.CharField()
用户只能create
/ update
SomeModel
为自己的组织,如果他是一组 "Coordinators" 他也可以 create
/ update
对于任何组织。
目前我的方法是在 .create()
和 .update()
方法中检查序列化程序中的这些条件,因为数据已经过验证并且我在那里提出 PermissionDenied
错误。不过感觉这不是"the right way"。我尝试创建自定义权限 类,但随后未验证数据,因为在序列化程序之前检查了权限 类。
您对我应该如何处理这个问题有什么建议吗?
抱歉英语不好,这不是我的母语。
谢谢!
编辑:
例子:
请求数据类似于:
payload = {'organization': 1, 'name': 'Name'}
因此,如果用户来自组织 1 或者他是协调员,则应授予访问权限并应创建 SomeModel
您可以编写自定义权限classHasWritePermissions
,它将检查用户是否具有write/update权限。
要创建 custom permission class,您需要覆盖 BasePermission
class 并实施 has_permission()
方法。如果请求被授予访问权限,此方法应该 return 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
我是 django rest 框架的新手,我有一些关于权限的问题。
所以我有一个用户是组织成员和某个组的成员。 假设我们有一个模型:
class SomeModel:
organization = models.ForeignKey(Organization)
name = models.CharField()
用户只能create
/ update
SomeModel
为自己的组织,如果他是一组 "Coordinators" 他也可以 create
/ update
对于任何组织。
目前我的方法是在 .create()
和 .update()
方法中检查序列化程序中的这些条件,因为数据已经过验证并且我在那里提出 PermissionDenied
错误。不过感觉这不是"the right way"。我尝试创建自定义权限 类,但随后未验证数据,因为在序列化程序之前检查了权限 类。
您对我应该如何处理这个问题有什么建议吗?
抱歉英语不好,这不是我的母语。 谢谢!
编辑: 例子: 请求数据类似于:
payload = {'organization': 1, 'name': 'Name'}
因此,如果用户来自组织 1 或者他是协调员,则应授予访问权限并应创建 SomeModel
您可以编写自定义权限classHasWritePermissions
,它将检查用户是否具有write/update权限。
要创建 custom permission class,您需要覆盖 BasePermission
class 并实施 has_permission()
方法。如果请求被授予访问权限,此方法应该 return 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