From 3786b4123b7e246ca4faa99f14a55b6f7196de59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8C=BF=E5=B0=8F=E5=A4=A9?= <1638245306@qq.com> Date: Tue, 21 May 2024 21:46:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=8F=98=E5=8C=96:=20?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E5=8A=A0=E5=85=A5=E5=88=A4=E6=96=AD,?= =?UTF-8?q?=E8=B6=85=E8=BF=875=E6=AC=A1=E8=B4=A6=E5=8F=B7=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E4=B8=8D=E6=AD=A3=E7=A1=AE=E5=88=99=E9=94=81=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/dvadmin/system/models.py | 1 + backend/dvadmin/system/views/login.py | 50 ++++++++++++++++----------- backend/dvadmin/system/views/user.py | 16 ++++----- 3 files changed, 38 insertions(+), 29 deletions(-) diff --git a/backend/dvadmin/system/models.py b/backend/dvadmin/system/models.py index 0e29403..e0e1841 100644 --- a/backend/dvadmin/system/models.py +++ b/backend/dvadmin/system/models.py @@ -70,6 +70,7 @@ class Users(CoreModel, AbstractUser): blank=True, help_text="关联部门", ) + login_error_count = models.IntegerField(default=0, verbose_name="登录错误次数", help_text="登录错误次数") objects = CustomUserManager() def set_password(self, raw_password): diff --git a/backend/dvadmin/system/views/login.py b/backend/dvadmin/system/views/login.py index 766a6c7..91beb15 100644 --- a/backend/dvadmin/system/views/login.py +++ b/backend/dvadmin/system/views/login.py @@ -86,28 +86,36 @@ class LoginSerializer(TokenObtainPairSerializer): user = Users.objects.get(username=attrs['username']) if not user.is_active: - raise CustomValidationError("账号被锁定") + raise CustomValidationError("账号已被锁定,联系管理员解锁") + try: + data = super().validate(attrs) + data["name"] = self.user.name + data["userId"] = self.user.id + data["avatar"] = self.user.avatar + data['user_type'] = self.user.user_type + dept = getattr(self.user, 'dept', None) + if dept: + data['dept_info'] = { + 'dept_id': dept.id, + 'dept_name': dept.name, - data = super().validate(attrs) - data["name"] = self.user.name - data["userId"] = self.user.id - data["avatar"] = self.user.avatar - data['user_type'] = self.user.user_type - dept = getattr(self.user, 'dept', None) - if dept: - data['dept_info'] = { - 'dept_id': dept.id, - 'dept_name': dept.name, - - } - role = getattr(self.user, 'role', None) - if role: - data['role_info'] = role.values('id', 'name', 'key') - request = self.context.get("request") - request.user = self.user - # 记录登录日志 - save_login_log(request=request) - return {"code": 2000, "msg": "请求成功", "data": data} + } + role = getattr(self.user, 'role', None) + if role: + data['role_info'] = role.values('id', 'name', 'key') + request = self.context.get("request") + request.user = self.user + # 记录登录日志 + save_login_log(request=request) + return {"code": 2000, "msg": "请求成功", "data": data} + except Exception as e: + user.login_error_count += 1 + if user.login_error_count >= 5: + user.is_active = False + raise CustomValidationError("账号已被锁定,联系管理员解锁") + user.save() + count = 5 - user.login_error_count + raise CustomValidationError(f"账号/密码错误;重试{count}次后将被锁定~") class LoginView(TokenObtainPairView): diff --git a/backend/dvadmin/system/views/user.py b/backend/dvadmin/system/views/user.py index d1470fe..c6c002e 100644 --- a/backend/dvadmin/system/views/user.py +++ b/backend/dvadmin/system/views/user.py @@ -115,14 +115,14 @@ class UserUpdateSerializer(CustomModelSerializer): ], ) - # password = serializers.CharField(required=False, allow_blank=True) - # mobile = serializers.CharField( - # max_length=50, - # validators=[ - # CustomUniqueValidator(queryset=Users.objects.all(), message="手机号必须唯一") - # ], - # allow_blank=True - # ) + def validate_is_active(self, value): + """ + 更改激活状态 + """ + print(111, value) + if value: + self.initial_data["login_error_count"] = 0 + return value def save(self, **kwargs): data = super().save(**kwargs)