restframwork组件的权限认证

在一个视图类下重写  authentication_classes = [TokenAuth,]然后去认证类TokenAuth里面实现认证逻辑代码

认证类代码块:

1 class TokenAuth(BaseAuthentication):
2     def authenticate(self,request):
3         token=request.GET.get("token")
4         token_obj=Token.objects.filter(token=token).first()
5         if not token_obj:
6             raise exceptions.AuthenticationFailed("用户验证失败,500")
7         else:
8             return token_obj.user,token_obj.token

可以继承基类object,但是需要重写两个方法authenticate和authenticate_header

from rest_framework.authentication import BaseAuthentication 导入模板类便于继承

直接继承 BaseAuthentication 可以只重写前面一个

视图类代码块:

 1 class BookShow(viewsets.ModelViewSet):
 2     authentication_classes = [TokenAuth,]
 3 
 4     queryset = Book.objects.all()
 5     serializer_class = BookModelSerializers
 6     def list(self, request, *args, **kwargs):
 7         print(request.user)
 8         print(request.auth)
 9         book_list=Book.objects.all()
10         bs=BookModelSerializers(book_list,many=True,context={"request":request})
11         return Response(bs.data)

 若想在全局实现认证或者权限:

需要在settings下去配置REST_FRAMEWORK参数:

1 REST_FRAMEWORK={
2 "DEFAULT_AUTHENTICATION_CLASSES" : ["apk.utils.TokenAuth",],  #认证组件
3 "DEFAULT_PERMISSION_CLASSES":["apk.utils.Permess"]            #权限组件
4 }
上面的apk.utils.TokenAuth 对应的就是自定义的认证组件类 apk.utils.Permess 以及权限组件类
组件的具体实现逻辑:
 1 from rest_framework import exceptions
 2 from rest_framework.authentication import BaseAuthentication
 3 from .models import *
 4 
 5 class TokenAuth(BaseAuthentication):
 6     def authenticate(self, request):
 7         token=request.GET.get("token")     
 8         token_obj=Token.objects.filter(token=token).first()
 9         if not token_obj:
10             raise exceptions.AuthenticationFailed("用户认证失败,500")
11         else:
12             return token_obj.user,token_obj.token
13 
14 
15 class Permess(object):
16     message="权限不够,请联系管理员!"     #定义未通过验证时的提示属性
17     def has_permission(self,request,exam):
18         user=request.user
19         type=User.objects.filter(user=user).first().user_type
20         if type==3:
21             return True
22         else:
23             return False

完成上述配置后,则全局下的所有表都需要认证和权限通过才可以访问了

需要注意的是标红部分的方法名为配置名,不可改变

部分不希望认证的数据表可以直接重写类下的配置:

# authentication_classes = []
# permission_classes = []
*****************************************************
关于解析器:
默认rest_framework里面支持的常用解析器有三个 JSONParse FormParse MultiPartParser
可以通过parser_classes=[JSONParse,]去指定使用哪个解析器去解析数据
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
对应url的封装:
把之前手动写的url链接地址更换成它集成的四条url链接
from django.conf.urls import url,include
from rest_framework import routers
routers=routers.DefaultRouter()  #实例化一个注册类工具对象
routers.register("books",views.BookShow)   #将要对应的url和视图类 进行关联

在urlpatterns里面进行加入

1 urlpatterns = [
2 
3 url(r'',include(routers.urls)),
4 
5 ]

就可以实现url的访问了

 




posted @ 2018-11-09 18:15  青红*皂了个白  阅读(211)  评论(0编辑  收藏  举报