美文网首页
rest_framework 用户认证

rest_framework 用户认证

作者: eeert2 | 来源:发表于2020-03-04 10:50 被阅读0次

分为两步实现

  • 第一步,创建自己的认证类Authentication,
    需要实现两个方法:
from rest_framework import exceptions
from rest_framework import authentication

class MyAuthentication(authentication.BaseAuthentication):
    """创建自己的`认证类`"""

    def authenticate(self,request):
        """返回结果只能有`三种`
            1.认证失败,抛异常 -> raise exceptions.AuthenticationFailed
            2.认证成功,返回元组(`用户信息`,`token令牌信息`),
                rest framework 会将这两个信息赋值给`request`对象,以便下一步使用。
                用户信息只能有一个,一旦认证成功,则不再对下一个`认证对象`进行认证
            3.既不抛异常,也没有返回值(或者返回`None`),则继续下一个`认证`

             如果最终都没有返回元组(`用户信息`,`token令牌信息`),则使用配置的默认用户信息:`匿名用户`
        """
        pass

    def authenticate_header(self,requet):
        pass
  • 第二步,将认证类进行配置,这里又分两种方式
    • 1)在MyView视图类中,将认证类Authentication,添加进authentication_classes列表中,表示该认证类只对当前视图类起作用。
class MyView(APIView):
    authentication_classes = ['MyAuthentication',......]
    
    def get(request, *args, **kwargs):
        pass
  • 2)在Djangosettings.py 进行全局配置
# settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': ['api.utils.auth.Authtication',]
}

这里的局部配置优先于全局配置,例如:

class MyView(APIView):
    authentication_classes = [ ] # 覆盖 APIView 的 authentication_classes 属性

则当前视图类可绕过全局认证


5.用户认证的源码流程

1.MyView.as_view() 这里调用Djangoas_view()生成view,并对view进行csrf豁免。

2.dispatch(),rest framework重写了dispatch()
1)执行initialize_request(request, *args, **kwargs)request进行包装,并执行
get_authenticators(),获取认证对象
2)执行 initial(request, *args, **kwargs),在initial中进行认证perform_authentication(request)

6. REST用户认证配置匿名用户以及token

# settings.py

REST_FRAMEWORK = {
    # 这里 UNAUTHENTICATED_USER、UNAUTHENTICATED_TOKEN 应是函数对象
    # 默认的匿名用户,token为 UNAUTHENTICATED_USER(),UNAUTHENTICATED_TOKEN()
    # None() 返回值仍然为None
    'UNAUTHENTICATED_USER': None,
    'UNAUTHENTICATED_TOKEN': None,
}

相关文章

网友评论

      本文标题:rest_framework 用户认证

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