功能变化: 重写登录方法
parent
ccbb1c74f8
commit
c6ac24f775
|
@ -54,25 +54,40 @@ class LoginSerializer(TokenObtainPairSerializer):
|
||||||
登录的序列化器:
|
登录的序列化器:
|
||||||
重写djangorestframework-simplejwt的序列化器
|
重写djangorestframework-simplejwt的序列化器
|
||||||
"""
|
"""
|
||||||
|
|
||||||
captcha = serializers.CharField(
|
captcha = serializers.CharField(
|
||||||
max_length=6, required=False, allow_null=True, allow_blank=True
|
max_length=6, required=False, allow_null=True, allow_blank=True
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Users
|
model = Users
|
||||||
fields = "__all__"
|
fields = "__all__"
|
||||||
read_only_fields = ["id"]
|
read_only_fields = ["id"]
|
||||||
|
|
||||||
default_error_messages = {"no_active_account": _("账号/密码错误")}
|
class LoginView(TokenObtainPairView):
|
||||||
|
"""
|
||||||
|
登录接口
|
||||||
|
"""
|
||||||
|
serializer_class = LoginSerializer
|
||||||
|
permission_classes = []
|
||||||
|
|
||||||
def validate(self, attrs):
|
def post(self, request, *args, **kwargs):
|
||||||
captcha = self.initial_data.get("captcha", None)
|
# username可能携带的不止是用户名,可能还是用户的其它唯一标识 手机号 邮箱
|
||||||
|
username = request.data.get('username',None)
|
||||||
|
if username is None:
|
||||||
|
return ErrorResponse(msg="参数错误")
|
||||||
|
password = request.data.get('password',None)
|
||||||
|
if password is None:
|
||||||
|
return ErrorResponse(msg="参数错误")
|
||||||
|
captcha = request.data.get('captcha',None)
|
||||||
|
if captcha is None:
|
||||||
|
return ErrorResponse(msg="参数错误")
|
||||||
|
captchaKey = request.data.get('captchaKey',None)
|
||||||
|
if captchaKey is None:
|
||||||
|
return ErrorResponse(msg="参数错误")
|
||||||
if dispatch.get_system_config_values("base.captcha_state"):
|
if dispatch.get_system_config_values("base.captcha_state"):
|
||||||
if captcha is None:
|
if captcha is None:
|
||||||
raise CustomValidationError("验证码不能为空")
|
raise CustomValidationError("验证码不能为空")
|
||||||
self.image_code = CaptchaStore.objects.filter(
|
self.image_code = CaptchaStore.objects.filter(
|
||||||
id=self.initial_data["captchaKey"]
|
id=captchaKey
|
||||||
).first()
|
).first()
|
||||||
five_minute_ago = datetime.now() - timedelta(hours=0, minutes=5, seconds=0)
|
five_minute_ago = datetime.now() - timedelta(hours=0, minutes=5, seconds=0)
|
||||||
if self.image_code and five_minute_ago > self.image_code.expiration:
|
if self.image_code and five_minute_ago > self.image_code.expiration:
|
||||||
|
@ -87,34 +102,36 @@ class LoginSerializer(TokenObtainPairSerializer):
|
||||||
else:
|
else:
|
||||||
self.image_code and self.image_code.delete()
|
self.image_code and self.image_code.delete()
|
||||||
raise CustomValidationError("图片验证码错误")
|
raise CustomValidationError("图片验证码错误")
|
||||||
data = super().validate(attrs)
|
try:
|
||||||
data["name"] = self.user.name
|
# 手动通过 user 签发 jwt-token
|
||||||
data["userId"] = self.user.id
|
user = Users.objects.get(username=username)
|
||||||
data["avatar"] = self.user.avatar
|
except:
|
||||||
dept = getattr(self.user, 'dept', None)
|
return DetailResponse(msg='该账号未注册')
|
||||||
|
# 获得用户后,校验密码并签发token
|
||||||
|
if not user.check_password(password):
|
||||||
|
return DetailResponse(msg='密码错误')
|
||||||
|
result = {
|
||||||
|
"name":user.name,
|
||||||
|
"userId":user.id,
|
||||||
|
"avatar":user.avatar,
|
||||||
|
}
|
||||||
|
dept = getattr(user, 'dept', None)
|
||||||
if dept:
|
if dept:
|
||||||
data['dept_info'] = {
|
result['dept_info'] = {
|
||||||
'dept_id': dept.id,
|
'dept_id': dept.id,
|
||||||
'dept_name': dept.name,
|
'dept_name': dept.name,
|
||||||
'dept_key': dept.key
|
'dept_key': dept.key
|
||||||
}
|
}
|
||||||
role = getattr(self.user, 'role', None)
|
role = getattr(user, 'role', None)
|
||||||
if role:
|
if role:
|
||||||
data['role_info'] = role.values('id', 'name', 'key')
|
result['role_info'] = role.values('id', 'name', 'key')
|
||||||
request = self.context.get("request")
|
refresh = LoginSerializer.get_token(user)
|
||||||
request.user = self.user
|
result["refresh"] = str(refresh)
|
||||||
|
result["access"] = str(refresh.access_token)
|
||||||
# 记录登录日志
|
# 记录登录日志
|
||||||
|
request.user = user
|
||||||
save_login_log(request=request)
|
save_login_log(request=request)
|
||||||
return {"code": 2000, "msg": "请求成功", "data": data}
|
return DetailResponse(data=result,msg="获取成功")
|
||||||
|
|
||||||
|
|
||||||
class LoginView(TokenObtainPairView):
|
|
||||||
"""
|
|
||||||
登录接口
|
|
||||||
"""
|
|
||||||
|
|
||||||
serializer_class = LoginSerializer
|
|
||||||
permission_classes = []
|
|
||||||
|
|
||||||
|
|
||||||
class LoginTokenSerializer(TokenObtainPairSerializer):
|
class LoginTokenSerializer(TokenObtainPairSerializer):
|
||||||
|
|
Loading…
Reference in New Issue