美文网首页《Django By Example》
Django2.0自定义User模型实现第三方登陆

Django2.0自定义User模型实现第三方登陆

作者: laotoutou | 来源:发表于2018-03-21 20:39 被阅读28次

    Django默认的User Model会自带last_login等字段,有时并不需要,尤其是password字段,比如第三方登陆时,不需要存储用户密码.删除这些多余字段,需要自定义User模型.

    项目环境
    django2
    restframework (推荐使用)

    自定义User

    models.py

    from django.db import models
    from django.contrib.auth.models import BaseUserManager
    
    class User(models.Model):
        user_id = models.CharField(max_length=30, primary_key=True, unique=True)        
    
        USERNAME_FIELD = 'user_id'
        objects = BaseUserManager()
        REQUIRED_FIELDS = []    
        
        @property
        def is_authenticated(self):
            return True
        
        @property
        def is_anonymous(self):
            return False
    

    注意继承models.Model后的User模型不会自带多余字段,但是需要重写is_authorizationis_anonymous两个property.

    settings.py

    AUTH_USER_MODEL = your_app.User
    

    自定义身份认证

    这里假设项目app名为your_app.

    your_app中新建文件permissions.py

    from rest_framework.permissions import BasePermission
    
    class CustomPermission(BasePermission):
    
        def has_permission(self, request, view):
            """
            Return `True` if permission is granted, `False` otherwise.
            """
            # 客户端传来的请求头可以通过request.META获取,key会自动大写并加一个HTTP_前缀
            token = request.META.get('HTTP_ENCRYPTED_DATA_KEY',None)
            # 在这里写是否给予权限
     
            return True
    
        def has_object_permission(self, request, view, obj):
            """
            Return `True` if permission is granted, `False` otherwise.
            """
            return True
    

    your_app中新建文件authorization.py

    from rest_framework.authentication import BaseAuthentication
    from your_app.models import User
    from django.core.exceptions import ObjectDoesNotExist
    
    
    class CustomAuthorization(BaseAuthentication):
    
        def authenticate(self, request):
            # 在这里换成客户端发送的token的key,需要加前缀HTTP_且大写!
            token = request.META.get('HTTP_YOUR_KEY',None)
            # 根据token查找user并返回一个tuple
            # 注意是tuple!
            return self.get_user(user_id), None
    
    
        # 需要实现该方法
        def get_user(self, user_id):
            try:
                return User.objects.get(pk=user_id)
            except ObjectDoesNotExist:
                return None
    
        def authenticate_header(self, request):
            pass
    

    再坚持一下,最后一步:

    settings.py

    REST_FRAMEWORK = {
        'DEFAULT_PERMISSION_CLASSES': (
            # 自定义permission
            'you_app.permissions.CustomPermission',
        ),
        'DEFAULT_AUTHENTICATION_CLASSES': (
            # 自定义authorization
            'your_app.authorization.CustomAuthorization',
        ),
    }
    

    到这里便结束了,这里说明为什么要自定义permission以及authorization:
    配置以上setting后,django中view的默认permission为CustomPermission,也就是说这个类会根据你自定义的permission决定是否允许用户执行操作,返回True即允许.
    实际上自定义permission之后就可以实现第三方登陆了,自定义authorization可以在view中通过request.user直接获得user对象,这个user其实就是authorization这个类根据token在数据库中查找得到的.

    相关文章

      网友评论

        本文标题:Django2.0自定义User模型实现第三方登陆

        本文链接:https://www.haomeiwen.com/subject/pplnqftx.html