• DRF 用户认证


    验证方式:

    BasicAuthentication:基础验证,通过用户名和密码验证

    SessionAuthentication:使用django的session验证

    TokenAuthentication:token认证

    可设置多个验证方式,有一个通过即可。验证通过后request.user会是对应User实例

    权限策略:

    AllowAny:没有限制

    IsAuthenticated:已认证

    其他权限策略:DRF权限

    光设置验证是没用的,还的设置权限。才能起到必须登录才能操作。

    全局配置

    1. REST_FRAMEWORK = {
    2. 'DEFAULT_PERMISSION_CLASSES': (
    3. 'rest_framework.permissions.IsAuthenticated',
    4. ),
    5. 'DEFAULT_AUTHENTICATION_CLASSES': (
    6. 'rest_framework.authentication.SessionAuthentication',
    7. 'rest_framework.authentication.TokenAuthentication',
    8. ),
    9. }

    单独配置:

    1. authentication_classes = []
    2. permission_classes = [AllowAny]

    也可以单独使用,可以覆盖全局配置。比如注册,登录肯定不需要进行验证。

    SessionAuthentication:

     

     需要在INSTALLED_APPS和MIDDLEWARE中进行配置。然后使用python manage.py migrate创建数据库表,默认是使用数据库保存session。

    1. login_info = {
    2. "username": data.get("username"),
    3. "password": data.get("password"),
    4. }
    5. try:
    6. user = authenticate(**login_info)
    7. if user is not None:
    8. login(request, user)

    使用authenticate()校验用户名密码,使用login()方法创建session。

    Django_session表会增加一条该用户的session记录

      在请求头中使用

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

    把CSRF校验设置成True,然后注册到中间件。

    1. from django.utils.deprecation import MiddlewareMixin
    2. class NotUseCsrfTokenMiddlewareMixin(MiddlewareMixin):
    3. def process_request(self, request):
    4. setattr(request, '_dont_enforce_csrf_checks', True)

    logout(request)

    该方法可删除session

    TokenAuthentication:

    需要在INSTALLED_APPS中注册,然后执行python manage.py migrate

    1. login_info = {
    2. "username": data.get("username"),
    3. "password": data.get("password"),
    4. }
    5. try:
    6. user = authenticate(**login_info)
    7. if user is not None:
    8. login(request, user)
    9. token, created = Token.objects.get_or_create(user=user)
    10. return SuccessResponse(data={"token": token.key})
    11. except Exception as e:
    12. return ErrorResponse(msg=str(e))
    token, created = Token.objects.get_or_create(user=user)
    

    token.key 可以获取对应token的值

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

     在请求头中使用Authorization参数,Token后要空两格再跟上具体值

    1. def post(self, request):
    2. try:
    3. Token.objects.filter(user=request.user).delete()
    4. logout(request)
    5. except ObjectDoesNotExist as e:
    6. return ErrorResponse(msg=str(e))
    7. return SuccessResponse()

    退出登录,直接将token删除即可,如果同时使用session。删除session的操作需要放在删除token后面?(放前面会报错,不知道是不是都这样,还是我的代码会这样)

  • 相关阅读:
    独家首发,阿里内部纯手码spring boot项目,你学会了吗?
    Kong自动注册kong-spring-boot-stater
    Oracle-ADG部署
    有成效的工作
    Angular 7 升级到Angular 12
    鸿蒙极速入门(四)-通过登录Demo了解ArkTS
    Python和Java有什么区别
    安装对应版本pytorch和torchvision
    node封装mysql
    javascript 大文件下载,分片下载,断点续传
  • 原文地址:https://blog.csdn.net/a54288447/article/details/126646278