DRF有一套自定义性很高的鉴权机制。
因为其为一个API框架,所以面向的前端可能是浏览器,也可能是手机APP,所以常规Web中以Cookie和Session授权的方法就不一定有效了。
DRF内置了三种授权(authentication)方法:HTTP基础认证、Session、Token。HTTP基础认证适合于纯浏览器的前端环境,Session适合于浏览器或基于浏览器内核的应用程序,Token适合无浏览器环境的应用程序。
用户也可以定义自己的授权方法,并任意搭配它们。举个例子,Pwnhub现在使用的是Session进行授权,以后如果要开发手机App,可能会增加基于Token的授权方法。
通过授权方法,DRF给每个请求标记上一个用户(未登录的用户被称为匿名用户AnonymousUser),但该用户是否有权限访问某个API,这就得问“许可模块”(Permission)了。
也就是说,Authentication模块只负责给请求“发通行证”,Permission模块负责检查这个“通行证”是否有权限访问某个地点。
不同的API View可以选择使用不同的Authentication和Permission,根据自己需要的访问权限任意搭配,也可以使用全局默认值。Pwnhub前台权限很简单,用Session授权,并只有两种Permission:登录用户和匿名用户,所以配置起来也比较简单。
另外,权限方面DRF还提供了一个更高级的模块:Throttling。使用这个模块,即可定义某个“用户”访问某个API的频度。举个例子,某视频网站允许每个免费用户每天观看5个视频,就需要经过如下步骤:
Authentication:Session认证 --> Permission:是否是已登录用户 --> Permission:是否是免费用户 --> Throttling:是否已观看5个视频 --> View:返回视频地址