From be7a93d81a427f78f9092cfe0f49c93dec134932 Mon Sep 17 00:00:00 2001 From: fit2bot <68588906+fit2bot@users.noreply.github.com> Date: Sun, 17 Jan 2021 15:28:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=9C=A8=E7=99=BB=E5=BD=95=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E6=B7=BB=E5=8A=A0CAS/OpenID=E7=AD=89=E7=AC=AC?= =?UTF-8?q?=E4=B8=89=E6=96=B9=E7=99=BB=E5=BD=95=E9=93=BE=E6=8E=A5;?= =?UTF-8?q?=E4=B8=8D=E5=86=8D=E8=87=AA=E5=8A=A8=E8=B7=B3=E8=BD=AC=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E5=9C=B0=E5=9D=80;=E7=BB=9F=E4=B8=80=E5=BC=80?= =?UTF-8?q?=E6=BA=90/=E4=BC=81=E4=B8=9A=E7=89=88=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2;=20(#5389)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 在登录页面添加CAS/OpenID等第三方登录链接;不再自动跳转登录地址;统一开源/企业版登录页面; * feat: 登录页面<忘记密码>链接,不限制第三方用户; 在忘记密码页面进行判断与限制 * feat: 登录页面<忘记密码>链接,不限制第三方用户; 在忘记密码页面进行判断与限制 (2) * fix: 调整样式 Co-authored-by: Bai Co-authored-by: Orange --- .../templates/authentication/login.html | 249 ++++++++++++------ .../templates/authentication/xpack_login.html | 179 ------------- apps/authentication/views/login.py | 33 +-- apps/jumpserver/conf.py | 3 - apps/jumpserver/context_processor.py | 1 + apps/jumpserver/settings/auth.py | 3 - apps/static/img/login_cas_logo.png | Bin 0 -> 7615 bytes apps/templates/_base_only_msg_content.html | 66 ----- apps/users/views/profile/reset.py | 15 +- 9 files changed, 180 insertions(+), 369 deletions(-) delete mode 100644 apps/authentication/templates/authentication/xpack_login.html create mode 100644 apps/static/img/login_cas_logo.png delete mode 100644 apps/templates/_base_only_msg_content.html diff --git a/apps/authentication/templates/authentication/login.html b/apps/authentication/templates/authentication/login.html index 521f3dbd2..e06567aa4 100644 --- a/apps/authentication/templates/authentication/login.html +++ b/apps/authentication/templates/authentication/login.html @@ -1,82 +1,179 @@ -{% extends '_base_only_msg_content.html' %} {% load static %} {% load i18n %} + + + + + + + + + {{ JMS_TITLE }} + + + + + + + -{% block content_title %} - {% trans 'Login' %} -{% endblock %} + + + + + -{% block content %} -
- {% csrf_token %} - {% if form.non_field_errors %} -
-

{{ form.non_field_errors.as_text }}

+ + + + +
+
+
+
- {% elif form.errors.captcha %} -

{% trans 'Captcha invalid' %}

- {% endif %} - -
- - {% if form.errors.username %} -
-

{{ form.errors.username.as_text }}

-
- {% endif %} -
-
- - - {% if form.errors.password %} -
-

{{ form.errors.password.as_text }}

-
- {% endif %} -
- {% if form.challenge %} -
- - {% if form.errors.challenge %} -
-

{{ form.errors.challenge.as_text }}

+
+
+ {% if form.challenge %} +
+ {% else %} +
+ {% endif %} + {{ JMS_TITLE }} +
+
+ {% trans 'Welcome back, please enter username and password to login' %}
- {% endif %} -
- {% endif %} -
- {{ form.captcha }} -
- +
+
+
+
+ + {% csrf_token %} + {% if form.non_field_errors %} + {% if form.challenge %} +
+ {% else %} +
+ {% endif %} +

{{ form.non_field_errors.as_text }}

+
+ {% elif form.errors.captcha %} +

{% trans 'Captcha invalid' %}

+ {% else %} +
+ {% endif %} - {% if demo_mode %} -

- Demo账号: admin 密码: admin -

- {% endif %} +
+ + {% if form.errors.username %} +
+

{{ form.errors.username.as_text }}

+
+ {% endif %} +
+
+ + + {% if form.errors.password %} +
+

{{ form.errors.password.as_text }}

+
+ {% endif %} +
+ {% if form.challenge %} +
+ + {% if form.errors.challenge %} +
+

{{ form.errors.challenge.as_text }}

+
+ {% endif %} +
+ {% endif %} + {% if form.captcha %} +
+ {{ form.captcha }} +
+ {% else %} +
+ {% endif %} +
+ +
-
-
- - {% trans 'Forgot password' %}? - +
+ {% if AUTH_OPENID or AUTH_CAS %} +
+
+ {% trans "More login options" %} + {% if AUTH_OPENID %} + + {% trans 'OpenID' %} + + {% endif %} + {% if AUTH_CAS %} + + {% trans 'CAS' %} + + {% endif %} +
+
+ {% else %} + +
+ +
+
+
+
+
+
+
- {% if AUTH_OPENID %} -
-

{% trans "More login options" %}

-
- -
- {% endif %} - - - - + -{% endblock %} + + + diff --git a/apps/authentication/templates/authentication/xpack_login.html b/apps/authentication/templates/authentication/xpack_login.html deleted file mode 100644 index d566ce1f8..000000000 --- a/apps/authentication/templates/authentication/xpack_login.html +++ /dev/null @@ -1,179 +0,0 @@ -{% load static %} -{% load i18n %} - - - - - - - - - {{ JMS_TITLE }} - - - - - - - - - - - - - - - - - - -
-
-
- -
-
-
- {% if form.challenge %} -
- {% else %} -
- {% endif %} - {{ JMS_TITLE }} -
-
- {% trans 'Welcome back, please enter username and password to login' %} -
-
-
-
-
-
- {% csrf_token %} - {% if form.non_field_errors %} - {% if form.challenge %} -
- {% else %} -
- {% endif %} -

{{ form.non_field_errors.as_text }}

-
- {% elif form.errors.captcha %} -

{% trans 'Captcha invalid' %}

- {% else %} -
- {% endif %} - -
- - {% if form.errors.username %} -
-

{{ form.errors.username.as_text }}

-
- {% endif %} -
-
- - - {% if form.errors.password %} -
-

{{ form.errors.password.as_text }}

-
- {% endif %} -
- {% if form.challenge %} -
- - {% if form.errors.challenge %} -
-

{{ form.errors.challenge.as_text }}

-
- {% endif %} -
- {% endif %} -
- {{ form.captcha }} -
-
- -
- - -
-
-
-
-
-
-
-
-
- - - - - - diff --git a/apps/authentication/views/login.py b/apps/authentication/views/login.py index 48bb16fba..7d7f1e8da 100644 --- a/apps/authentication/views/login.py +++ b/apps/authentication/views/login.py @@ -41,42 +41,13 @@ __all__ = [ class UserLoginView(mixins.AuthMixin, FormView): key_prefix_captcha = "_LOGIN_INVALID_{}" redirect_field_name = 'next' - - def get_template_names(self): - template_name = 'authentication/login.html' - if not settings.XPACK_ENABLED: - return template_name - - from xpack.plugins.license.models import License - if not License.has_valid_license(): - return template_name - - template_name = 'authentication/xpack_login.html' - return template_name - - def get_redirect_url_if_need(self, request): - redirect_url = '' - # show jumpserver login page if request http://{JUMP-SERVER}/?admin=1 - if self.request.GET.get("admin", 0): - return None - if settings.AUTH_OPENID: - redirect_url = reverse(settings.AUTH_OPENID_AUTH_LOGIN_URL_NAME) - elif settings.AUTH_CAS: - redirect_url = reverse(settings.CAS_LOGIN_URL_NAME) - - if redirect_url: - query_string = request.GET.urlencode() - redirect_url = "{}?{}".format(redirect_url, query_string) - return redirect_url + template_name = 'authentication/login.html' def get(self, request, *args, **kwargs): if request.user.is_staff: return redirect(redirect_user_first_login_or_index( request, self.redirect_field_name) ) - redirect_url = self.get_redirect_url_if_need(request) - if redirect_url: - return redirect(redirect_url) request.session.set_test_cookie() return super().get(request, *args, **kwargs) @@ -131,8 +102,8 @@ class UserLoginView(mixins.AuthMixin, FormView): context = { 'demo_mode': os.environ.get("DEMO_MODE"), 'AUTH_OPENID': settings.AUTH_OPENID, + 'AUTH_CAS': settings.AUTH_CAS, 'rsa_public_key': rsa_public_key, - 'AUTH_DB': settings.AUTH_DB } kwargs.update(context) return super().get_context_data(**kwargs) diff --git a/apps/jumpserver/conf.py b/apps/jumpserver/conf.py index 4d8b7c0ce..602916cb6 100644 --- a/apps/jumpserver/conf.py +++ b/apps/jumpserver/conf.py @@ -461,9 +461,6 @@ class DynamicConfig: backends.insert(0, 'authentication.backends.api.SSOAuthentication') return backends - def AUTH_DB(self): - return len(self.AUTHENTICATION_BACKENDS()) == 2 - def XPACK_LICENSE_IS_VALID(self): if not HAS_XPACK: return False diff --git a/apps/jumpserver/context_processor.py b/apps/jumpserver/context_processor.py index cf0ea559d..7fdc7eab2 100644 --- a/apps/jumpserver/context_processor.py +++ b/apps/jumpserver/context_processor.py @@ -13,6 +13,7 @@ def jumpserver_processor(request): 'LOGO_TEXT_URL': static('img/logo_text.png'), 'LOGIN_IMAGE_URL': static('img/login_image.png'), 'FAVICON_URL': static('img/facio.ico'), + 'LOGIN_CAS_LOGO_URL': static('img/login_cas_logo.png'), 'JMS_TITLE': 'JumpServer', 'VERSION': settings.VERSION, 'COPYRIGHT': 'FIT2CLOUD 飞致云' + ' © 2014-2020', diff --git a/apps/jumpserver/settings/auth.py b/apps/jumpserver/settings/auth.py index 9f91cdb1d..4430aae2f 100644 --- a/apps/jumpserver/settings/auth.py +++ b/apps/jumpserver/settings/auth.py @@ -9,9 +9,6 @@ from ..const import CONFIG, DYNAMIC, PROJECT_DIR OTP_ISSUER_NAME = CONFIG.OTP_ISSUER_NAME OTP_VALID_WINDOW = CONFIG.OTP_VALID_WINDOW -# Auth DB -AUTH_DB = DYNAMIC.AUTH_DB - # Auth LDAP settings AUTH_LDAP = DYNAMIC.AUTH_LDAP AUTH_LDAP_SERVER_URI = DYNAMIC.AUTH_LDAP_SERVER_URI diff --git a/apps/static/img/login_cas_logo.png b/apps/static/img/login_cas_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c6288af5b3fca0509421ea4fad7c5c9f09541161 GIT binary patch literal 7615 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 - - - - - - JumpServer - - {% include '_head_css_js.html' %} - - - - - - -
-
-
-

- {% block msg_title %} - {% trans 'Welcome to the JumpServer open source fortress' %} - {% endblock %} -

- {% block msg_content %} -

- {% trans "The world's first fully open source fortress, using the GNU GPL v2.0 open source protocol, is a professional operation and maintenance audit system in compliance with 4A." %} -

-

- {% trans "Developed using Python/Django, following the Web 2.0 specification and equipped with industry-leading Web Terminal solutions, with beautiful interactive interface and good user experience." %} -

-

- {% trans 'Distributed architecture is adopted to support multi-machine room deployment across regions, central node provides API, and each machine room deploys login node, which can be extended horizontally and without concurrent access restrictions.' %} -

-

- {% trans "Changes the world, starting with a little bit." %} -

- {% endblock %} -
-
-
-
- - - {% block content_title %} - {% trans 'Login' %} - {% endblock %} -
- {% block content %} {% endblock %} -
-
-
-
-
-
- {% include '_copyright.html' %} -
-
-
- - diff --git a/apps/users/views/profile/reset.py b/apps/users/views/profile/reset.py index c25726561..65c690339 100644 --- a/apps/users/views/profile/reset.py +++ b/apps/users/views/profile/reset.py @@ -39,20 +39,21 @@ class UserForgotPasswordView(FormView): form_class = forms.UserForgotPasswordForm def form_valid(self, form): - request = self.request email = form.cleaned_data['email'] user = get_object_or_none(User, email=email) if not user: error = _('Email address invalid, please input again') form.add_error('email', error) return self.form_invalid(form) - elif not user.can_update_password(): - error = _('User auth from {}, go there change password') - form.add_error('email', error.format(user.get_source_display())) + + if not user.is_local: + error = _('The user is from {} and goes there to change the password' + ''.format(user.get_source_display())) + form.add_error('email', error) return self.form_invalid(form) - else: - send_reset_password_mail(user) - return redirect('authentication:forgot-password-sendmail-success') + + send_reset_password_mail(user) + return redirect('authentication:forgot-password-sendmail-success') class UserForgotPasswordSendmailSuccessView(TemplateView):