From a25da8d479ccad18889cac9afed3021ba725cdde Mon Sep 17 00:00:00 2001 From: xinwen Date: Wed, 5 Aug 2020 16:04:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(authentication):=20=E8=B6=85=E7=BA=A7?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E5=AF=86=E7=A0=81=E4=B8=8D=E8=83=BD?= =?UTF-8?q?=E6=98=AF`admin`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/authentication/api/token.py | 4 +++- apps/authentication/errors.py | 9 +++++++++ apps/authentication/mixins.py | 21 +++++++++++++++++++++ apps/authentication/urls/view_urls.py | 1 + apps/authentication/views/login.py | 17 +++++++++++++++++ apps/common/utils/django.py | 1 - apps/locale/zh/LC_MESSAGES/django.mo | Bin 56305 -> 56492 bytes apps/locale/zh/LC_MESSAGES/django.po | 23 ++++++++++++++--------- 8 files changed, 65 insertions(+), 11 deletions(-) diff --git a/apps/authentication/api/token.py b/apps/authentication/api/token.py index 6c6a34aa2..f7516496c 100644 --- a/apps/authentication/api/token.py +++ b/apps/authentication/api/token.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # - +from django.shortcuts import redirect from rest_framework.permissions import AllowAny from rest_framework.response import Response from rest_framework.generics import CreateAPIView @@ -40,3 +40,5 @@ class TokenCreateApi(AuthMixin, CreateAPIView): return Response(e.as_data(), status=400) except errors.NeedMoreInfoError as e: return Response(e.as_data(), status=200) + except errors.PasswdTooSimple as e: + return redirect(e.url) diff --git a/apps/authentication/errors.py b/apps/authentication/errors.py index 241881ba0..26363363e 100644 --- a/apps/authentication/errors.py +++ b/apps/authentication/errors.py @@ -211,3 +211,12 @@ class LoginConfirmOtherError(LoginConfirmBaseError): class SSOAuthClosed(JMSException): default_code = 'sso_auth_closed' default_detail = _('SSO auth closed') + + +class PasswdTooSimple(JMSException): + default_code = 'passwd_too_simple' + default_detail = _('Your password is too simple, please change it for security') + + def __init__(self, url, *args, **kwargs): + super(PasswdTooSimple, self).__init__(*args, **kwargs) + self.url = url diff --git a/apps/authentication/mixins.py b/apps/authentication/mixins.py index a450f610a..23ddac3cf 100644 --- a/apps/authentication/mixins.py +++ b/apps/authentication/mixins.py @@ -1,9 +1,12 @@ # -*- coding: utf-8 -*- # +from urllib.parse import urlencode from functools import partial import time + from django.conf import settings from django.contrib.auth import authenticate +from django.shortcuts import reverse from common.utils import get_object_or_none, get_request_ip, get_logger from users.models import User @@ -91,6 +94,8 @@ class AuthMixin: elif user.password_has_expired: raise CredentialError(error=errors.reason_password_expired) + self._check_passwd_is_too_simple(user, password) + clean_failed_count(username, ip) request.session['auth_password'] = 1 request.session['user_id'] = str(user.id) @@ -98,6 +103,22 @@ class AuthMixin: request.session['auth_backend'] = auth_backend return user + @classmethod + def _check_passwd_is_too_simple(cls, user, password): + if user.is_superuser and password == 'admin': + reset_passwd_url = reverse('authentication:reset-password') + query_str = urlencode({ + 'token': user.generate_reset_token() + }) + reset_passwd_url = f'{reset_passwd_url}?{query_str}' + + flash_page_url = reverse('authentication:passwd-too-simple-flash-msg') + query_str = urlencode({ + 'redirect_url': reset_passwd_url + }) + + raise errors.PasswdTooSimple(f'{flash_page_url}?{query_str}') + def check_user_auth_if_need(self): request = self.request if request.session.get('auth_password') and \ diff --git a/apps/authentication/urls/view_urls.py b/apps/authentication/urls/view_urls.py index 12e1fea84..467e32d0d 100644 --- a/apps/authentication/urls/view_urls.py +++ b/apps/authentication/urls/view_urls.py @@ -21,6 +21,7 @@ urlpatterns = [ path('password/forgot/sendmail-success/', users_view.UserForgotPasswordSendmailSuccessView.as_view(), name='forgot-password-sendmail-success'), path('password/reset/', users_view.UserResetPasswordView.as_view(), name='reset-password'), + path('password/too-simple-flash-msg/', views.FlashPasswdTooSimpleMsgView.as_view(), name='passwd-too-simple-flash-msg'), path('password/reset/success/', users_view.UserResetPasswordSuccessView.as_view(), name='reset-password-success'), path('password/verify/', users_view.UserVerifyPasswordView.as_view(), name='user-verify-password'), diff --git a/apps/authentication/views/login.py b/apps/authentication/views/login.py index a0b8804e1..d6331aa82 100644 --- a/apps/authentication/views/login.py +++ b/apps/authentication/views/login.py @@ -29,6 +29,7 @@ from ..forms import get_user_login_form_cls __all__ = [ 'UserLoginView', 'UserLogoutView', 'UserLoginGuardView', 'UserLoginWaitConfirmView', + 'FlashPasswdTooSimpleMsgView', ] @@ -91,6 +92,8 @@ class UserLoginView(mixins.AuthMixin, FormView): new_form._errors = form.errors context = self.get_context_data(form=new_form) return self.render_to_response(context) + except errors.PasswdTooSimple as e: + return redirect(e.url) return self.redirect_to_guard_view() def redirect_to_guard_view(self): @@ -151,6 +154,8 @@ class UserLoginGuardView(mixins.AuthMixin, RedirectView): return self.format_redirect_url(self.login_confirm_url) except errors.MFAUnsetError as e: return e.url + except errors.PasswdTooSimple as e: + return e.url else: auth_login(self.request, user) self.send_auth_signal(success=True, user=user) @@ -222,4 +227,16 @@ class UserLogoutView(TemplateView): return super().get_context_data(**kwargs) +@method_decorator(never_cache, name='dispatch') +class FlashPasswdTooSimpleMsgView(TemplateView): + template_name = 'flash_message_standalone.html' + def get(self, request, *args, **kwargs): + context = { + 'title': _('Please change your password'), + 'messages': _('Your password is too simple, please change it for security'), + 'interval': 5, + 'redirect_url': request.GET.get('redirect_url'), + 'auto_redirect': True, + } + return self.render_to_response(context) diff --git a/apps/common/utils/django.py b/apps/common/utils/django.py index 50c3f0ea1..b2a919401 100644 --- a/apps/common/utils/django.py +++ b/apps/common/utils/django.py @@ -2,7 +2,6 @@ # import re from django.shortcuts import reverse as dj_reverse -from django.db.models import Subquery, QuerySet from django.conf import settings from django.utils import timezone diff --git a/apps/locale/zh/LC_MESSAGES/django.mo b/apps/locale/zh/LC_MESSAGES/django.mo index cb2695eeceba7079ef663998880c7098de03d2f7..10950173da98413cd8ba4da1ad59f6963a7ed21a 100644 GIT binary patch delta 15538 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\n" "Language-Team: JumpServer team\n" @@ -1359,11 +1359,11 @@ msgstr "复制成功" msgid "Welcome back, please enter username and password to login" msgstr "欢迎回来,请输入用户名和密码登录" -#: authentication/views/login.py:82 +#: authentication/views/login.py:83 msgid "Please enable cookies and try again." msgstr "设置你的浏览器支持cookie" -#: authentication/views/login.py:178 +#: authentication/views/login.py:183 msgid "" "Wait for {} confirm, You also can copy link to her/him
\n" " Don't close this page" @@ -1371,18 +1371,26 @@ msgstr "" "等待 {} 确认, 你也可以复制链接发给他/她
\n" " 不要关闭本页面" -#: authentication/views/login.py:183 +#: authentication/views/login.py:188 msgid "No ticket found" msgstr "没有发现工单" -#: authentication/views/login.py:215 +#: authentication/views/login.py:220 msgid "Logout success" msgstr "退出登录成功" -#: authentication/views/login.py:216 +#: authentication/views/login.py:221 msgid "Logout success, return login page" msgstr "退出登录成功,返回到登录页面" +#: authentication/views/login.py:236 +msgid "Please change your password" +msgstr "请修改密码" + +#: authentication/views/login.py:237 +msgid "Your password is too simple, please change it for security" +msgstr "你的密码过于简单,为了安全,请修改" + #: common/const/__init__.py:6 #, python-format msgid "%(name)s was created successfully" @@ -4222,9 +4230,6 @@ msgstr "旗舰版" #~ msgid "Update asset user auth" #~ msgstr "更新资产用户认证信息" -#~ msgid "Please input password" -#~ msgstr "请输入密码" - #~ msgid "Asset user auth" #~ msgstr "资产用户信息"