简介
在django3中为了实现更细粒度的控制,可以创建自定义权限类,如IsAuthorOrReadOnly,允许任何人查看但仅允许管理员和作者编辑。
这个类重写了has_object_permission方法,检查请求方法是否安全以及对象作者与请求用户是否匹配。在views.py中应用这个权限类,确保只有作者能编辑其博客文章。列表视图的对象级过滤需额外实现。
1 项目权限限制
在项目级别设置严格的权限策略,并根据需要在视图级别放宽策略。这就是我们要做的。
Django_REST_Framework随附了许多内置的项目级,我们可以使用的设置
• AllowAny - #任何用户,无论是否登录,全部权限。
• IsAuthenticated - #仅认证,注册 登录的用户
• IsAdminUser - #仅管理员,超级用户
• IsAuthenticatedOrReadOnly - #未经授权的用户可以查看任何页面,但只有认证用户可以编辑新建删除。
这四个设置中的任何一个都需要更新DEFAULT_PERMISSION_CLASSES,然后设置和刷新我们的网络浏览器。
2 自定义权限 Custom permissions
只希望特定博客帖子的作者能够对其进行编辑或删除;否则博客文章应为只读。
超级用户帐户应具有对帐户的完整CRUD访问权限 ,但常规用户testuser只可编辑自己的。
代码内部,Django REST Framework依赖于BasePermission类,所有其他每个任务类权限都从该BasePermission类继承。这意味着内置的权限设置(例如AllowAny,IsAuthenticated,其他自定义是将其扩展)。
由于我们的需求是 任何人都可以查看,但是只有管理员和作者可以编辑。将重载 has_object_permission方法。
如果请求包含HTTP SAFE_METHODS中包含动词(一个包含GET,OPTIONS和HEAD的元组),那么它是有只读的许可被授予
# posts/permissions.py
from rest_framework import permissions
class IsAuthorOrReadOnly(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
# Read-only permissions are allowed for any request
if request.method in permissions.SAFE_METHODS:
return True
# Write permissions are only allowed to the author of a post
return obj.author == request.user
关于创建,删除或编辑功能 在这种情况下,我们检查对象的作者是否匹配,这是我们的博客文章obj.author与发出请求request.user的用户匹配。
回到views.py文件中,我们应该导入IsAuthorOrReadOnly,然后我们可以添加Permission_PostDetail的类
请注意,通用视图将仅检查对象级权限以获取检索到的视图。一个模型实例。如果您需要对列表视图进行对象级过滤-对于以下内容的集合实例-您需要过滤的方法实现:
https://www.django-rest-framework.org/api-guide/filtering/#overriding-the-initial-queryset
3 小结
设置严格的项目级别权限策略的想法,这样只有经过身份验证的用户才能查看API。