博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django-restframework 之 Authentication 实现方式
阅读量:5788 次
发布时间:2019-06-18

本文共 2923 字,大约阅读时间需要 9 分钟。

>

纳尼,你居然敢说看不懂???那就且听在下拙见...

REST framework 的 Request 类扩展与标准的 HttpRequest,并做了相应的增强,比如更加灵活的请求解析(request parsing)和认证(request authentication)。

认证(Authentication)

REST framework 提供了灵活的认证方式:

  • 可以在 API 的不同部分使用不同的认证策略。
  • 支持同时使用多个身份验证策略。
  • 提供与传入请求关联的用户(user)和令牌(token)信息。

.user

request.user 通常会返回 django.contrib.auth.models.User 的一个实例,但其行为取决于正在使用的身份验证策略。

如果请求未经身份验证,则 request.user 的默认值是 django.contrib.auth.models.AnonymousUser 的实例(就是匿名用户)。

关于 .user 的更多内容,以后再说~

.auth

request.auth 返回任何附加的认证上下文(authentication context)。request.auth 的确切行为取决于正在使用的身份验证策略,但它通常可能是请求经过身份验证的令牌(token)实例。

如果请求未经身份验证,或者没有附加上下文(context),则 request.auth 的默认值为 None

关于 .auth 的更多内容,以后再说~

.authenticators

APIView 类或 @api_view 装饰器将确保根据视图上设置的 authentication_classes 或基于 settings 文件中的 DEFAULT_AUTHENTICATORS 设置将此属性(.authenticators)自动设置为 Authentication 实例列表。

通常不需要关注该属性......

注意:调用 .user.auth 属性时可能会引发 WrappedAttributeError 异常。

这些错误源于 authenticator 作为一个标准的 AttributeError ,为了防止它们被外部属性访问修改,有必要重新提升为不同的异常类型。Python 无法识别来自 authenticator 的 AttributeError,并会立即假定请求对象没有 .user.auth 属性。authenticator 需要修复。

认证实现过程

下面是我总结的精简流程:

django 的url请求对应一个视图函数as_view函数,其中调用rest_framework/views.py中的dispatch函数,这个函数会根据request的请求方法,去调用我们在view对象中定义的对应的方法:urlpatterns = [    url(        r"^test/?", testView.as_view(),    )] testView是继承APIView的View类: class TestView(APIView):    authentication_classes = (        BasicAuthentication,        SessionAuthentication,        TokenAuthentication,    )        permission_classes = (        IsAuthenticated,    )    def get(self,request):        pass如果是get请求会调用as_view中的dispatch方法,dispatch根据request.Method调用对应的get的方法,url->视图函数权限认证是在dispatch中做的           self.as_view()                ||                vv    def dispatch(request,*args,**kwargs):                ||                VV    self.initial(request,*args,**kwargs):                ||                VV    self.perform_authentication    self.check_permissions    self.check_throttles验证某个用户:perform_authentication(request)    request.userrequest.user其实是一个@property函数里面有个self._authenticate()方法_authenticate(self)方法中验证用户就是authenticator.authenticate(self)**self.authenticators从哪里来?**就是从视图函数中的authentication_classes中的来,关于对view控制的其他类都在rest_framework/views.py的APIView类中定义了。在BasicAuthentication中必须实现authenticate方法,并且返回一个用户,并赋值给request.user,这个request.user就是系统中进行用户认证的user对象,后续的权限认证就是通过该user为依据进行判断是否有某个api的权限!user = authenticate(**credentials)                ||                vv user = backend.authenticate(**credentials)这个authenticate是django的authenticate方法:                 ||                 vv主要是去数据库校验数据,校验结束!!!接着执行self.check_permissions(self,request):如果权限不通过,那么会执行self.permission_denied,然后这个异常会在dispatch函数中被捕捉,当做结果传递给response。当一次授权通过后,再一次访问这个API时,用户名密码从哪来?cookie和session

多说几句:

.authenticators 其实存的就是当前使用的认证器(authenticator)列表,打印出来大概是这样:

[
,
]

可以看到这里使用的认证器(authenticator)包括 SessionAuthenticationBasicAuthentication

转载于:https://www.cnblogs.com/opensars/p/9492553.html

你可能感兴趣的文章
LeetCode--112--路径总和
查看>>
DeviceIOControl与驱动层 - 缓冲区模式
查看>>
感悟贴2016-05-13
查看>>
vim使用教程
查看>>
JDK在LINUX系统平台下的部署案例与总结
查看>>
跨vlan通信-----单臂路由技术
查看>>
百度编辑器ueditor 光标位置的坐标
查看>>
DEV-C++ 调试方法简明图文教程(转)
查看>>
VS2017+EF+Mysql生成实体数据模型(解决闪退的坑)
查看>>
C++多态、继承的简单分析
查看>>
库克称未来苹果用户可自己决定是否降频 网友:你是在搞笑吗?
查看>>
6倍性能差100TB容量,阿里云POLARDB咋实现?
查看>>
linux 安装 MySQLdb for python
查看>>
Sublime Text 2 技巧
查看>>
使用fscanf()函数从磁盘文件读取格式化数据
查看>>
参加婚礼
查看>>
h5 audio相关手册
查看>>
刚毕业从事java开发需要掌握的技术
查看>>
CSS Custom Properties 自定义属性
查看>>
vim
查看>>