From c32c892a6c50dc90dfdb593e164ebcf02ad214ef Mon Sep 17 00:00:00 2001 From: Andrii Gakhov Date: Fri, 5 Apr 2019 11:37:18 +0200 Subject: [PATCH] Add support for User models with renamed `username` field. Django supports having different name for usernames. It's very common to use `email` as username, and the Django framework profived all nessesary features to do that in a convenient way, i.e. methods to set and access those fields without knowing their exact names. This commit fixed the current user interaction in CAS client to use the mentioned above methods, as it recommended by Django core and implemented in their statndard ModelBackend. --- cas/backends.py | 2 +- cas/models.py | 8 +++++--- cas/tests/test_backend.py | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/cas/backends.py b/cas/backends.py index c355e64..0ea65ed 100644 --- a/cas/backends.py +++ b/cas/backends.py @@ -234,7 +234,7 @@ def authenticate(self, request, ticket, service): return None try: - user = User.objects.get(username__iexact=username) + user = User._default_manager.get_by_natural_key(username) except User.DoesNotExist: # user will have an "unusable" password if settings.CAS_AUTO_CREATE_USER: diff --git a/cas/models.py b/cas/models.py index 54b1606..185223b 100644 --- a/cas/models.py +++ b/cas/models.py @@ -85,13 +85,15 @@ def get_tgt_for(user): if not settings.CAS_PROXY_CALLBACK: raise CasConfigException("No proxy callback set in settings") + username = user.get_username() + try: - return Tgt.objects.get(username=user.username) + return Tgt.objects.get(username=username) except ObjectDoesNotExist: logger.warning('No ticket found for user {user}'.format( - user=user.username + user=username )) - raise CasTicketException("no ticket found for user " + user.username) + raise CasTicketException("no ticket found for user " + username) def delete_old_tickets(**kwargs): diff --git a/cas/tests/test_backend.py b/cas/tests/test_backend.py index cdcb2c9..66ea242 100644 --- a/cas/tests/test_backend.py +++ b/cas/tests/test_backend.py @@ -27,4 +27,4 @@ def test_user_auto_create(self, verify): with self.settings(CAS_AUTO_CREATE_USER=True): user = backend.authenticate('fake', 'fake') - self.assertEquals(user.username, username) + self.assertEquals(user.get_username(), username)