Skip to content

Commit 521089e

Browse files
authored
Merge pull request #95 from francoisfreitag/user-attributes-deferred
Support several required fields during User creation
2 parents 966316a + 871ca14 commit 521089e

File tree

4 files changed

+41
-5
lines changed

4 files changed

+41
-5
lines changed

CHANGES

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ Thanks to plumdog
1919

2020
Thanks to plumdog
2121

22+
UNRELEASED
23+
----------
24+
- Allowed creating Users with multiple required fields.
25+
2226
0.17.1 (2018-07-16)
2327
----------
2428
- A 403 (permission denied) is now raised if a SAMLResponse is replayed, instead of 500.

djangosaml2/backends.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -147,19 +147,21 @@ def _get_or_create_saml2_user(self, main_attribute, attributes, attribute_mappin
147147
main_attribute)
148148
django_user_main_attribute = self.get_django_user_main_attribute()
149149
user_query_args = self.get_user_query_args(main_attribute)
150-
user_create_defaults = {django_user_main_attribute: main_attribute}
151150

152151
User = get_saml_user_model()
152+
built = False
153153
try:
154-
user, created = User.objects.get_or_create(
155-
defaults=user_create_defaults, **user_query_args)
154+
user = User.objects.get(**user_query_args)
155+
except User.DoesNotExist:
156+
user = User(**{django_user_main_attribute: main_attribute})
157+
built = True
156158
except MultipleObjectsReturned:
157159
logger.error("There are more than one user with %s = %s",
158160
django_user_main_attribute, main_attribute)
159161
return None
160162

161-
if created:
162-
logger.debug('New user created')
163+
if built:
164+
logger.debug('Configuring new user "%s"', main_attribute)
163165
user = self.configure_user(user, attributes, attribute_mapping)
164166
else:
165167
logger.debug('User updated')

tests/testprofiles/models.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,13 @@ class StandaloneUserModel(models.Model):
3030
USERNAME_FIELD.
3131
"""
3232
username = models.CharField(max_length=30, unique=True)
33+
34+
35+
class RequiredFieldUser(models.Model):
36+
email = models.EmailField(unique=True)
37+
email_verified = models.BooleanField()
38+
39+
USERNAME_FIELD = 'email'
40+
41+
def set_unusable_password(self):
42+
pass

tests/testprofiles/tests.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,26 @@ def test_invalid_model_attribute_log(self):
134134
logs.output,
135135
)
136136

137+
@override_settings(AUTH_USER_MODEL='testprofiles.RequiredFieldUser')
138+
def test_create_user_with_required_fields(self):
139+
backend = Saml2Backend()
140+
attribute_mapping = {
141+
'mail': ['email'],
142+
'mail_verified': ['email_verified']
143+
}
144+
attributes = {
145+
'mail': ['[email protected]'],
146+
'mail_verified': [True],
147+
}
148+
# User creation does not fail if several fields are required.
149+
user = backend._get_or_create_saml2_user(
150+
151+
attributes,
152+
attribute_mapping,
153+
)
154+
self.assertEquals(user.email, '[email protected]')
155+
self.assertIs(user.email_verified, True)
156+
137157
def test_django_user_main_attribute(self):
138158
backend = Saml2Backend()
139159

0 commit comments

Comments
 (0)