Skip to content

Commit 984179d

Browse files
split authenticate into separate overridable function (#1)
* split authenticate into separate overridable function * cleaner exception * basic unit test * remove new test * space to revert change
1 parent f1aa8e0 commit 984179d

File tree

1 file changed

+34
-13
lines changed

1 file changed

+34
-13
lines changed

djangosaml2/views.py

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -550,7 +550,40 @@ def post(self, request, attribute_mapping=None, create_unknown_user=None):
550550
if callable(create_unknown_user):
551551
create_unknown_user = create_unknown_user()
552552

553+
try:
554+
user = self.authenticate_user(
555+
request,
556+
session_info,
557+
attribute_mapping,
558+
create_unknown_user,
559+
assertion_info
560+
)
561+
except PermissionDenied as e:
562+
return self.handle_acs_failure(
563+
request,
564+
exception=e,
565+
session_info=session_info,
566+
)
567+
568+
relay_state = self.build_relay_state()
569+
custom_redirect_url = self.custom_redirect(user, relay_state, session_info)
570+
if custom_redirect_url:
571+
return HttpResponseRedirect(custom_redirect_url)
572+
relay_state = validate_referral_url(request, relay_state)
573+
logger.debug("Redirecting to the RelayState: %s", relay_state)
574+
return HttpResponseRedirect(relay_state)
575+
576+
def authenticate_user(
577+
self,
578+
request,
579+
session_info,
580+
attribute_mapping,
581+
create_unknown_user,
582+
assertion_info
583+
):
584+
"""Calls Django's authenticate method after the SAML response is verified"""
553585
logger.debug("Trying to authenticate the user. Session info: %s", session_info)
586+
554587
user = auth.authenticate(
555588
request=request,
556589
session_info=session_info,
@@ -563,11 +596,7 @@ def post(self, request, attribute_mapping=None, create_unknown_user=None):
563596
"Could not authenticate user received in SAML Assertion. Session info: %s",
564597
session_info,
565598
)
566-
return self.handle_acs_failure(
567-
request,
568-
exception=PermissionDenied("No user could be authenticated."),
569-
session_info=session_info,
570-
)
599+
raise PermissionDenied("No user could be authenticated.")
571600

572601
auth.login(self.request, user)
573602
_set_subject_id(request.saml_session, session_info["name_id"])
@@ -576,14 +605,6 @@ def post(self, request, attribute_mapping=None, create_unknown_user=None):
576605
self.post_login_hook(request, user, session_info)
577606
self.customize_session(user, session_info)
578607

579-
relay_state = self.build_relay_state()
580-
custom_redirect_url = self.custom_redirect(user, relay_state, session_info)
581-
if custom_redirect_url:
582-
return HttpResponseRedirect(custom_redirect_url)
583-
relay_state = validate_referral_url(request, relay_state)
584-
logger.debug("Redirecting to the RelayState: %s", relay_state)
585-
return HttpResponseRedirect(relay_state)
586-
587608
def post_login_hook(
588609
self, request: HttpRequest, user: settings.AUTH_USER_MODEL, session_info: dict
589610
) -> None:

0 commit comments

Comments
 (0)