From 26fc56b4be1b5f1357f52c5f9c3bb7abd87a6912 Mon Sep 17 00:00:00 2001 From: ibuler Date: Fri, 17 Sep 2021 16:00:23 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E7=99=BB=E5=BD=95htm?= =?UTF-8?q?l?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../templates/authentication/login.html | 38 ++++------------- apps/authentication/views/login.py | 40 ++++++++++++++++++ apps/static/img/login_feishu_logo.png | Bin 6640 -> 2916 bytes apps/static/img/login_oidc_logo.png | Bin 0 -> 1885 bytes 4 files changed, 48 insertions(+), 30 deletions(-) create mode 100644 apps/static/img/login_oidc_logo.png diff --git a/apps/authentication/templates/authentication/login.html b/apps/authentication/templates/authentication/login.html index dfc0f3d9b..08591892b 100644 --- a/apps/authentication/templates/authentication/login.html +++ b/apps/authentication/templates/authentication/login.html @@ -146,11 +146,9 @@
{% csrf_token %}
- {% if form.errors %} + {% if form.non_field_errors %}

- {% if form.non_field_errors %} - {{ form.non_field_errors.as_text }} - {% endif %} + {{ form.non_field_errors.as_text }}

{% else %}

@@ -197,35 +195,15 @@

- {% if AUTH_OPENID or AUTH_CAS or AUTH_WECOM or AUTH_DINGTALK or AUTH_FEISHU %} + {% if auth_methods %}
- {% trans "More login options" %} - {% if AUTH_OPENID %} - - {% endif %} - {% if AUTH_CAS %} - - {% endif %} - {% if AUTH_WECOM %} - - {% endif %} - {% if AUTH_DINGTALK %} - - {% endif %} - {% if AUTH_FEISHU %} - - {% endif %} + {% endfor %}
{% else %}
diff --git a/apps/authentication/views/login.py b/apps/authentication/views/login.py index a33d8cee8..a916db1bc 100644 --- a/apps/authentication/views/login.py +++ b/apps/authentication/views/login.py @@ -5,6 +5,7 @@ from __future__ import unicode_literals import os import datetime +from django.templatetags.static import static from django.contrib.auth import login as auth_login, logout as auth_logout from django.http import HttpResponse from django.shortcuts import reverse, redirect @@ -136,6 +137,43 @@ class UserLoginView(mixins.AuthMixin, FormView): self.request.session[RSA_PRIVATE_KEY] = None self.request.session[RSA_PUBLIC_KEY] = None + @staticmethod + def get_support_auth_methods(): + auth_methods = [ + { + 'name': 'OpenID', + 'enabled': settings.AUTH_OPENID, + 'url': reverse('authentication:openid:login'), + 'logo': static('img/login_oidc_logo.png') + }, + { + 'name': 'CAS', + 'enabled': settings.AUTH_CAS, + 'url': reverse('authentication:cas:cas-login'), + 'logo': static('img/login_cas_logo.png') + }, + { + 'name': _('WeCom'), + 'enabled': settings.AUTH_WECOM, + 'url': reverse('authentication:wecom-qr-login'), + 'logo': static('img/login_wecom_logo.png') + }, + { + 'name': _('DingTalk'), + 'enabled': settings.AUTH_DINGTALK, + 'url': reverse('authentication:dingtalk-qr-login'), + 'logo': static('img/login_dingtalk_logo.png') + }, + { + 'name': _('FeiShu'), + 'enabled': settings.AUTH_FEISHU, + 'url': reverse('authentication:feishu-qr-login'), + 'logo': static('img/login_feishu_logo.png') + } + ] + return [method for method in auth_methods] + # return [method for method in auth_methods if method['enabled']] + def get_context_data(self, **kwargs): forgot_password_url = reverse('authentication:forgot-password') has_other_auth_backend = settings.AUTHENTICATION_BACKENDS[0] != settings.AUTH_BACKEND_MODEL @@ -144,6 +182,8 @@ class UserLoginView(mixins.AuthMixin, FormView): context = { 'demo_mode': os.environ.get("DEMO_MODE"), + 'auth_methods': self.get_support_auth_methods(), + 'has_other_auth' 'AUTH_OPENID': settings.AUTH_OPENID, 'AUTH_CAS': settings.AUTH_CAS, 'AUTH_WECOM': settings.AUTH_WECOM, diff --git a/apps/static/img/login_feishu_logo.png b/apps/static/img/login_feishu_logo.png index 054f350f5c7047ac20c667e08298dfc1441e999a..1b9b51cf4e34b13dc333ea7670e0e796e1ac07bb 100644 GIT binary patch literal 2916 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 diff --git a/apps/static/img/login_oidc_logo.png b/apps/static/img/login_oidc_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0f2d5b5c3af30fbf4ead8b2573b8190860b3a9ba GIT binary patch literal 1885 zcmV-j2cr0iP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv0RI600RN!9r;`8x00(qQO+^Rg2@wZ0DC9Ulk^le(JV``BRA}Dq+HH(nRUOCi z&&+Pi?$U=9w=J-;EkY}87Xb}M%|bAeRGu1Rgpl|E>I+5GD89hN2=O8D5k(2cU`#a_ z2_X@(s0hY~N-a$^K2S7jng!VsFx^t@wy@iMxW4$`X=kT1bMLmD*`2n(WM0h8IrrS} zIp?19|NqYA1XE$I9{^sttM9ODogaU;A#JtKGti}&!oEheIVZqXKu^Qfcn`jU-yRph zRX~^F8hik6MiJj^&Vs8#iv8f57DrSgGwjHx_&MZ7VF8&X?wPy*Nalf;3R6cJCwYgd=u5>HwZ9l7w@x z8f&m?`O8n{979Jp%mocl%=PK|yH&*9(Lf&X9xlhrEb?SNU2a23!Z zUV}Ga0B^*(B5v+T%lv+#*mY+NSp7aOBvVN-nK(n_$VE(JG=={=wqYy&fxVT_RSsTl zP;vuTsk|JQ2&ZBIeOOqd`qb>g=t3e!a$yR+H2tj;Gvp;ag~#vnIbr z$_>uNyVHjI>p(VA-J+8R@Cp15_u@BZ`e7Z|fSYh9epwT^3g}AVP`odNo{eU?RwT2j z(<27psucWtDfszmXIvxJmHVkNr7K`NaXmhj-ek5K$F8_D_~N zafNuz{*2e9^-Ee-6}SR+4L&EP?X_V9d1KM(E{$*jH|Mz7C~n2~%P%$omRP`U6)X3JVv9UmM0|O6 zkS@Hs1l%uzih4@$9Wk=a1TE>m>2FK=e~~z{S&i4Hop7F*q1_H&#XHec0=`c6JMjd* zErR)`!PZ&4_K7TN2OdcQUzGx{b!Zl>PCKRpr?-p!X+uW4lekAjKXazaPOj*HDY1Z# z;4k<|3b{Z7Y0Ima!akl+t_vR&(Mn5?a>)k0Uzz1uLstu{M=L{@vhqLR;f%5!xLuij z(u&X};BjH+Jd;s=rEmo=X;tWQ-{r3&-`t;3XDxmx5{|YKbgO_DE5fiJf-%G9&bw#Me`h@r=4laEo~NZxSik4Dk5~e{f2dL66}J!p7O1;~wV=f9nx^ zR@l0wLo|bfgP!Vnzj^S9)=c0E9T3U>4dUI-QkzJ)zl2AHmwbyj`#EFhqJf1SyN45! zIj61~A6HDpv+-%XS2%yOQR$d-s9^f(i(mNGW!>XL>yz4H`GhzNdbCkr#8(~RiiPZH zd{V5+Ka(AImus=`nXXI}Z{ELP#d=BIJY_zyY^UVOqlr} z5hi=XRQG(i1YI`8_hT@Hzes%Ky+Ithbsj>=vGOg?M1P;Z4$QYjMt=5@9(UEGr$S2xKBi5{o;&vW!fp->vrEa ze%9#bpHCOse9-HWY{_Y)PoqaPbqh^4XbkyHz zWq8G05UK# zF)c7TEipG#FgH3iGCDIdD=;uRFfguZz%&2=03~!qSaf7zbY(hiZ)9m^c>ppnGBGVM zIV~|aR4_L>H8MIgGAl4JIxsNbG