验证方式:
BasicAuthentication:基础验证,通过用户名和密码验证
SessionAuthentication:使用django的session验证
TokenAuthentication:token认证
可设置多个验证方式,有一个通过即可。验证通过后request.user会是对应User实例
权限策略:
AllowAny:没有限制
IsAuthenticated:已认证
其他权限策略:DRF权限
光设置验证是没用的,还的设置权限。才能起到必须登录才能操作。
全局配置
- REST_FRAMEWORK = {
- 'DEFAULT_PERMISSION_CLASSES': (
- 'rest_framework.permissions.IsAuthenticated',
- ),
- 'DEFAULT_AUTHENTICATION_CLASSES': (
- 'rest_framework.authentication.SessionAuthentication',
- 'rest_framework.authentication.TokenAuthentication',
- ),
- }
单独配置:
- authentication_classes = []
- permission_classes = [AllowAny]
也可以单独使用,可以覆盖全局配置。比如注册,登录肯定不需要进行验证。
SessionAuthentication:


需要在INSTALLED_APPS和MIDDLEWARE中进行配置。然后使用python manage.py migrate创建数据库表,默认是使用数据库保存session。
- login_info = {
- "username": data.get("username"),
- "password": data.get("password"),
- }
- try:
- user = authenticate(**login_info)
- if user is not None:
- login(request, user)
使用authenticate()校验用户名密码,使用login()方法创建session。
Django_session表会增加一条该用户的session记录

在请求头中使用

使用SessionAuthentication可能会提示"detail": "CSRF Failed: CSRF token missing." DRF默认是启用CSRF的。

把CSRF校验设置成True,然后注册到中间件。
- from django.utils.deprecation import MiddlewareMixin
- class NotUseCsrfTokenMiddlewareMixin(MiddlewareMixin):
- def process_request(self, request):
- setattr(request, '_dont_enforce_csrf_checks', True)

logout(request)
该方法可删除session
TokenAuthentication:

需要在INSTALLED_APPS中注册,然后执行python manage.py migrate
- login_info = {
- "username": data.get("username"),
- "password": data.get("password"),
- }
- try:
- user = authenticate(**login_info)
- if user is not None:
- login(request, user)
- token, created = Token.objects.get_or_create(user=user)
- return SuccessResponse(data={"token": token.key})
- except Exception as e:
- return ErrorResponse(msg=str(e))
token, created = Token.objects.get_or_create(user=user)
token.key 可以获取对应token的值

authtoken_token表会增加一条该用户的token记录

在请求头中使用Authorization参数,Token后要空两格再跟上具体值
- def post(self, request):
- try:
- Token.objects.filter(user=request.user).delete()
- logout(request)
- except ObjectDoesNotExist as e:
- return ErrorResponse(msg=str(e))
- return SuccessResponse()
退出登录,直接将token删除即可,如果同时使用session。删除session的操作需要放在删除token后面?(放前面会报错,不知道是不是都这样,还是我的代码会这样)