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_authorization和is_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在数据库中查找得到的.