美文网首页django-rest-framework开发
django-rest-framework(实战篇)——drf权

django-rest-framework(实战篇)——drf权

作者: Ccccolin_aha | 来源:发表于2018-04-18 14:22 被阅读21次

    official guide——permissions

    • auth是用来做用户验证
    • permission是用来做权限认证

    判断用户是否登陆:
    user_operation/view.py:

    from rest_framework.permissions import IsAuthenticated
    permission_classes = (IsAuthenticated,)
    

    用户未登录访问userfav的list会给我们抛出401的错误。

    在utils中新建permissions,这是我们自定义的permissions。
    utils/permissions.py:

    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
    

    这个自定义的permission类继承了我们的BasePermission。它有一个方法叫做has_object_permission,是否有对象权限。检测我们从数据库中拿出来的obj的user是否等于request.user。安全的方法也就是不会对数据库进行变动的方法,总是可以让大家都有权限访问到。

    views中添加该自定义的权限认证类
    user_operation/views.py:

    from utils.permissions import IsOwnerOrReadOnly
    
    permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
    

    这样在做删除的时候就会验证权限。

    不能让所有的收藏关系数据都被获取到。因此我们要重载get_queryset方法

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

    重载之后queryset的参数配置就可以注释掉了。

    token的认证最好是配置到view里面去,而不是配置到全局中。

    前端的每一个request请求都加入我们的token的话,token过期了,当用户访问goods列表页等不需要token认证的页面也会拿不到数据。

    将setting中的'rest_framework.authentication.SessionAuthentication'删除掉。

    然后在具体的view中来import以及进行配置

    user_operation/views.py中实现代码:

    from rest_framework_jwt.authentication import JSONWebTokenAuthentication
    
    authentication_classes = (JSONWebTokenAuthentication, )
    

    此时在我们在后台无法使用session登陆查看userfav,是因为我们的类内auth并不包含session auth,添加session登陆:

    from rest_framework.authentication import SessionAuthentication
    
    authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
    

    相关文章

      网友评论

        本文标题:django-rest-framework(实战篇)——drf权

        本文链接:https://www.haomeiwen.com/subject/zfhvkftx.html