您的位置:首页 > 编程语言 > Go语言

Django Rest Framework 电商项目 8-4 DRF的权限验证

2019-02-16 20:06 2006 查看

本节解决权限问题。

在DRF官方文档的API Guide中的Permissions中。Authentication是用户验证,Permissions是权限验证。有一些默认的权限验证,AllowAny、IsAuthenticated、IsAdminUser等等。

首先用户必须登录,在views.py中:

[code]from rest_framework.permissions import IsAuthenticated

在UserFavViewSet中添加逻辑:

[code]permission_classes = (IsAuthenticated, )  # 未登录会抛401

这样,如果是未登录的操作,会返回401。

除此之外,我们还需自定义一个permission,来判断用户所操作的数据是否是自己的记录。

在官方文档的Custom permissions中的Examples中给出了两个例子,一个是判定ip是否在白名单中,我们关心的是第二个用户权限的验证。

在utils中,新建一个permissions.py,然后将官文中的例子拷贝过去:

[code]from rest_framework import permissions

class IsOwnerOrReadOnly(permissions.BasePermission):
"""
Object-level permission to only allow owners of an object to edit it.
Assumes the model instance has an `owner` attribute.
"""

def has_object_permission(self, request, view, obj):
# Read permissions are allowed to any request,
# so we'll always allow GET, HEAD or OPTIONS requests.
if request.method in permissions.SAFE_METHODS:
return True

# Instance must have an attribute named `owner`.
return obj.user == request.user

这样,再在view中配置它,引入:

[code]from utils.permissions import IsOwnerOrReadOnly

改为:

[code]permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)

此外,我们获取list的时候,不能获取所有用户的信息,只能获取当前的用户的数据,所以我们应该删除掉

[code]queryset = UserFav.objects.all()

而去重载get_queryset方法:

[code]def get_queryset(self):
return UserFav.objects.filter(user=self.request.user)

解决之前的一个bug,用户收藏功能的model中的__str__应该返回:

[code]self.user.username

测试。

补充一点,BasicAuthentication是用户密码的认证模式。

我们应该将JWT的配置放在view中,而不是全局。token是会过期的,如果总是要每一个request都和用户绑定,会抛异常,一些公共页面也访问不了了。

删除settings.py中配置的

[code]'rest_framework_jwt.authentication.JSONWebTokenAuthentication'

在views.py中:

[code]from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from rest_framework.authentication import SessionAuthentication

然后配置:

[code]authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: