Sai*_*hna 5 django django-rest-framework
假设获取用户列表的 API 端点是这样的
/api_auth/user/
Run Code Online (Sandbox Code Playgroud)
但我想限制只有拥有api_key 的人才能访问此列表
/api_auth/user/?access_key=$omeRandomHash3252532
Run Code Online (Sandbox Code Playgroud)
如何使用 Django Rest Framework 实现这样的访问系统?
我应该使用权限来实现吗?
django-rest-framework 不支持开箱即用,但可以轻松实现:
如果你看一下http://www.django-rest-framework.org/api-guide/authentication/,您将看到自定义身份验证方法的示例。基于此,您需要实现如下内容:
从 django.contrib.auth.models 导入用户
从rest_framework导入身份验证
从rest_framework导入异常
类 APIKeyAuthentication(authentication.BaseAuthentication):
def 验证(自我,请求):
api_key = request.GET.get('api_key')
如果不是 api_key:
返回无
尝试:
用户 = get_user_from_api_key(api_key)
除了 User.DoesNotExist:
引发异常。AuthenticationFailed('没有 API 密钥的用户')
返回(用户,无)
应该APIKeyAuthentication放在authentication.py模块上并使用REST_FRAMEWORKsettings.py上的设置进行配置,如下所示
休息框架 = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'my_custom_package.authentication.APIKeyAuthentication',
)
}
现在,上面的代码所做的是检查api_key参数是否存在(如果不存在,它将返回 None 以检查请求是否可以以不同方式进行身份验证 - 如果您不想检查任何其他身份验证类,则只需引发exceptions.AuthenticationFailed异常就像我们在下面找不到用户时所做的那样。现在,我们需要实现一个从 API_KEYget_user_from_api_key返回User实例的函数。如果找到与传递的 api_key 相关的用户,则将返回该实例,如果没有exceptions.AuthenticationFailed异常的话将被抛出。
至于get_user_from_api_key功能,它的实现取决于您的需求。例如,如果您想为每个用户创建一个新的 api 密钥,您应该创建一个APIKey模型,该模型将具有api_key CharField和ForeignKey到User具有 this 的api_key。然后,该get_user_from_api_key函数将查询APIKey模型以获取用户提供的api_key.
更新
如果你想使用 django-rest-framework 权限而不是身份验证,你可以创建一个APIKeyPermission像这样的类:
从rest_framework导入权限
类 APIKeyPermission(permissions.BasePermission):
def has_permission(自身,请求,视图):
api_key = request.GET.get('api_key')
返回 check_permission(api_key, 请求)
该check_permission函数将检查传递的 api_key 是否具有该特定请求的权限。请查看http://www.django-rest-framework.org/api-guide/permissions/上的示例以获取更多信息 - 您可以选择实现has_object_permission对象级权限而不是视图级权限。
| 归档时间: |
|
| 查看次数: |
2113 次 |
| 最近记录: |