1818from django .conf import settings
1919from django .contrib import auth
2020from django .contrib .auth .backends import ModelBackend
21- from django .core .exceptions import (
22- MultipleObjectsReturned , ImproperlyConfigured ,
23- )
24-
25- from djangosaml2 .signals import pre_user_save
21+ from django .core .exceptions import (ImproperlyConfigured ,
22+ MultipleObjectsReturned )
2623
24+ from .signals import pre_user_save
2725
2826logger = logging .getLogger ('djangosaml2' )
2927
3028
3129def get_model (model_path ):
30+ from django .apps import apps
3231 try :
33- from django .apps import apps
3432 return apps .get_model (model_path )
35- except ImportError :
36- # Django < 1.7 (cannot use the new app loader)
37- from django .db .models import get_model as django_get_model
38- try :
39- app_label , model_name = model_path .split ('.' )
40- except ValueError :
41- raise ImproperlyConfigured ("SAML_USER_MODEL must be of the form "
42- "'app_label.model_name'" )
43- user_model = django_get_model (app_label , model_name )
44- if user_model is None :
45- raise ImproperlyConfigured ("SAML_USER_MODEL refers to model '%s' "
46- "that has not been installed" % model_path )
47- return user_model
33+ except LookupError :
34+ raise ImproperlyConfigured ("SAML_USER_MODEL refers to model '%s' that has not been installed" % model_path )
35+ except ValueError :
36+ raise ImproperlyConfigured ("SAML_USER_MODEL must be of the form 'app_label.model_name'" )
4837
4938
5039def get_saml_user_model ():
51- try :
52- # djangosaml2 custom user model
40+ if hasattr (settings , 'SAML_USER_MODEL' ):
5341 return get_model (settings .SAML_USER_MODEL )
54- except AttributeError :
55- try :
56- # Django 1.5 Custom user model
57- return auth .get_user_model ()
58- except AttributeError :
59- return auth .models .User
42+ return auth .get_user_model ()
6043
6144
6245class Saml2Backend (ModelBackend ):
@@ -89,7 +72,9 @@ def authenticate(self, request, session_info=None, attribute_mapping=None,
8972 else :
9073 logger .error ('The nameid is not available. Cannot find user without a nameid.' )
9174 else :
92- saml_user = self .get_attribute_value (django_user_main_attribute , attributes , attribute_mapping )
75+ saml_user = self .get_attribute_value (django_user_main_attribute ,
76+ attributes ,
77+ attribute_mapping )
9378
9479 if saml_user is None :
9580 logger .error ('Could not find saml_user value' )
@@ -111,7 +96,11 @@ def get_attribute_value(self, django_field, attributes, attribute_mapping):
11196 logger .debug ('attribute_mapping: %s' , attribute_mapping )
11297 for saml_attr , django_fields in attribute_mapping .items ():
11398 if django_field in django_fields and saml_attr in attributes :
114- saml_user = attributes [saml_attr ][0 ]
99+ saml_user = attributes .get (saml_attr , [None ])[0 ]
100+ if not saml_user :
101+ logger .error ('attributes[saml_attr] attribute '
102+ 'value is missing. Probably the user '
103+ 'session is expired.' )
115104 return saml_user
116105
117106 def is_authorized (self , attributes , attribute_mapping ):
@@ -158,19 +147,21 @@ def _get_or_create_saml2_user(self, main_attribute, attributes, attribute_mappin
158147 main_attribute )
159148 django_user_main_attribute = self .get_django_user_main_attribute ()
160149 user_query_args = self .get_user_query_args (main_attribute )
161- user_create_defaults = {django_user_main_attribute : main_attribute }
162150
163151 User = get_saml_user_model ()
152+ built = False
164153 try :
165- user , created = User .objects .get_or_create (
166- 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
167158 except MultipleObjectsReturned :
168159 logger .error ("There are more than one user with %s = %s" ,
169160 django_user_main_attribute , main_attribute )
170161 return None
171162
172- if created :
173- logger .debug ('New user created' )
163+ if built :
164+ logger .debug ('Configuring new user "%s"' , main_attribute )
174165 user = self .configure_user (user , attributes , attribute_mapping )
175166 else :
176167 logger .debug ('User updated' )
0 commit comments