默认的身份验证类设置在rest_framework.settings.api_settings中
在Django REST Framework中,身份验证是一个非常重要的功能,可以用来确保只有授权用户才能访问受限资源。REST框架提供了一个默认的身份验证类,默认设置在rest_framework.settings.api_settings中。
首先,我们需要在settings.py文件中设置身份验证类的默认值。可以像下面这样添加以下代码:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
]
}
上面的代码设置了两个默认的身份验证类,分别是SessionAuthentication和BasicAuthentication。SessionAuthentication基于Django的会话框架,通过在请求中包含一个sessionid来验证用户。而BasicAuthentication基于HTTP基本身份验证,通过在请求头中包含用户名和密码来验证用户。
当一个受限视图被请求时,REST框架会使用默认的身份验证类来验证用户。如果用户未通过验证,框架将返回一个401未授权的响应。
在实际使用中,我们可以根据需要自定义身份验证类。下面是一个自定义身份验证类的例子:
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
class CustomAuthentication(BaseAuthentication):
def authenticate(self, request):
# 在这里编写自定义的验证逻辑
# 如果验证成功,则返回一个元组 (user, token)
# 如果验证失败,则抛出 AuthenticationFailed 异常
pass
def authenticate_header(self, request):
# 在这里指定身份验证头的格式
# 例如,如果是Token身份验证,则返回 "Token realm='api'"
pass
在上面的例子中,我们自定义了一个CustomAuthentication类,继承自BaseAuthentication类。我们需要实现authenticate方法来执行自定义的验证逻辑。如果验证成功,可以返回一个(user, token)元组,其中user是验证通过的用户对象,token是可选的令牌。如果验证失败,应该抛出AuthenticationFailed异常。
我们还可以实现authenticate_header方法来指定身份验证头的格式。例如,如果我们是使用Token身份验证,可以返回"Token realm='api'"。
为了在视图中使用自定义的身份验证类,我们需要在相应的视图类或视图集中添加authentication_classes属性,像下面这样:
from rest_framework.views import APIView
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from .authentication import CustomAuthentication
class MyView(APIView):
authentication_classes = [SessionAuthentication, BasicAuthentication, CustomAuthentication]
def get(self, request):
# 这里是视图的逻辑代码
pass
在上面的例子中,我们将自定义身份验证类CustomAuthentication添加到了authentication_classes属性中。这意味着,当该视图被请求时,将使用SessionAuthentication、BasicAuthentication和CustomAuthentication这三个身份验证类进行验证。
总结起来,通过在settings.py文件中的REST_FRAMEWORK设置中指定默认身份验证类,我们可以方便地为整个项目设置默认的身份验证方式。同时,我们也可以根据需要自定义身份验证类,并在相应的视图中使用。身份验证是确保只有授权用户才能访问敏感资源的重要功能,对于任何需要登录的API,都需要考虑使用适当的身份验证机制。
