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

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模型实现第三方登陆)