认证之匿名用户

需求:匿名用户和User都能访问这条url

path('host/', views.HostView.as_view({'get': 'list'})),  # 匿名测试

流程:

  1、认证时,User访问返Tuer,匿名用户必须返回None,即不处理

# 认证类
class Authentication(object):

    def authenticate(self, request):
        token = request.GET.get('token')
        obj = models.Token.objects.filter(token=token).first()
        if obj:
            # return obj.user.username, obj.token
            return obj.user, obj.token
        else:
            # raise exceptions.AuthenticationFailed('验证失败')
            return None
    # 不加这个方法会报错
    def authenticate_header(self, request):
        pass
# 匿名用户和User都能访问
class HostView(viewsets.ModelViewSet):
    authentication_classes = [utils.Authentication]  # 认证是匿名还是User,匿名用户在认证时返回None
    pagination_class = []  # 都能访问不需要加权限

    def list(self, request, *args, **kwargs):
        print(request.data)
        return Response('我是匿名用户')

  2、其它正常视图的权限便要加多一层处理,需要判断当前访问对象时User还是匿名用户

# 权限类
class PermissionCheck(object):
    message = "请登录"

    # 这里的request属于APIview重新构造的reuqest,经过认证后,认证组件返回一个request.user和request.auth,
    # 这两个的返回结果在自己的认证类中自定义返回的结果,所以这里能够直接调用
    def has_permission(self, request, view):
        if request.user:  # 如果是用户 继续走下一条权限
            return True
        else:
            return False

class PermissionCheckTwo(object):
    message = "你不是超级管理员"
    def has_permission(self, request, view):
        if request.user.role == 3:
            return True
        else:
            return False
class BookView(viewsets.ModelViewSet):
    authentication_classes = [utils.Authentication, ] 
    permission_classes = [utils.PermissionCheck, utils.PermissionCheckTwo]  # 加多一次权限验证
    queryset = models.Book.objects.all()
    serializer_class = serializers.BookSerializers

 

也可以在settings中设置匿名用户:  

REST_FRAMEWORK = {
    'UNAUTHENTICATED_USER': None,
    'UNAUTHENTICATED_TOKEN': None,
}

 

posted @ 2020-03-22 23:33  aikell  阅读(403)  评论(0)    收藏  举报