diff --git a/docs/release-notes/version-3.3.md b/docs/release-notes/version-3.3.md index ba6e4a06e..3f4272f95 100644 --- a/docs/release-notes/version-3.3.md +++ b/docs/release-notes/version-3.3.md @@ -23,6 +23,7 @@ * [#10305](https://github.com/netbox-community/netbox/issues/10305) - Fix Virtual Chassis master field cannot be null according to the API * [#10307](https://github.com/netbox-community/netbox/issues/10307) - Correct value for "Passive 48V (4-pair)" PoE type selection * [#10333](https://github.com/netbox-community/netbox/issues/10333) - Show available values for `ui_visibility` field of CustomField for CSV import +* [#10337](https://github.com/netbox-community/netbox/issues/10337) - Display SSO links when local authentication fails * [#10362](https://github.com/netbox-community/netbox/issues/10362) - Correct display of custom fields when editing an L2VPN termination --- diff --git a/netbox/templates/login.html b/netbox/templates/login.html index ea5cfc3e5..66b519671 100644 --- a/netbox/templates/login.html +++ b/netbox/templates/login.html @@ -13,6 +13,16 @@ {% endif %} + {# Login form errors #} + {% if form.non_field_errors %} + + {% endif %} + {# Login form #}
@@ -48,16 +58,6 @@ {% endfor %} {% endif %} - - {# Login form errors #} - {% if form.non_field_errors %} - - {% endif %} {# Page footer #} diff --git a/netbox/users/views.py b/netbox/users/views.py index 4af273d29..33ef3fadd 100644 --- a/netbox/users/views.py +++ b/netbox/users/views.py @@ -47,20 +47,14 @@ class LoginView(View): 'url': f'{url}?{urlencode(params)}', } - def get(self, request): - form = LoginForm(request) - - if request.user.is_authenticated: - logger = logging.getLogger('netbox.auth.login') - return self.redirect_to_next(request, logger) - + def get_auth_backends(self, request): auth_backends = [] saml_idps = get_saml_idps() + for name in load_backends(settings.AUTHENTICATION_BACKENDS).keys(): - url = reverse('social:begin', args=[name, ]) + url = reverse('social:begin', args=[name]) params = {} - next = request.GET.get('next') - if next: + if next := request.GET.get('next'): params['next'] = next if name.lower() == 'saml' and saml_idps: for idp in saml_idps: @@ -71,9 +65,18 @@ class LoginView(View): else: auth_backends.append(self.gen_auth_data(name, url, params)) + return auth_backends + + def get(self, request): + form = LoginForm(request) + + if request.user.is_authenticated: + logger = logging.getLogger('netbox.auth.login') + return self.redirect_to_next(request, logger) + return render(request, self.template_name, { 'form': form, - 'auth_backends': auth_backends, + 'auth_backends': self.get_auth_backends(request), }) def post(self, request): @@ -107,7 +110,7 @@ class LoginView(View): return render(request, self.template_name, { 'form': form, - 'auth_backends': load_backends(settings.AUTHENTICATION_BACKENDS), + 'auth_backends': self.get_auth_backends(request), }) def redirect_to_next(self, request, logger):