models_backend: use a dynamic proxy user model
This commit is contained in:
parent
2a3a165f60
commit
00a896a708
|
@ -10,13 +10,27 @@ def upn(username, realm):
|
|||
'''Build an UPN from a username and a realm'''
|
||||
return u'{0}@{1}'.format(username, realm)
|
||||
|
||||
PROXY_USER_MODEL = None
|
||||
|
||||
def get_proxy_user_model():
|
||||
global PROXY_USER_MODEL
|
||||
if PROXY_USER_MODEL is None:
|
||||
class ProxyUser(get_user_model()):
|
||||
def roles(self):
|
||||
return self.groups.values_list('name', flat=True)
|
||||
|
||||
class Meta:
|
||||
proxy = True
|
||||
PROXY_USER_MODEL = ProxyUser
|
||||
return PROXY_USER_MODEL
|
||||
|
||||
class ModelBackend(ModelBackend):
|
||||
"""
|
||||
Authenticates against settings.AUTH_USER_MODEL.
|
||||
"""
|
||||
|
||||
def get_query(self, username, realm):
|
||||
UserModel = get_user_model()
|
||||
UserModel = get_proxy_user_model()
|
||||
username_field = UserModel.USERNAME_FIELD
|
||||
queries = []
|
||||
try:
|
||||
|
@ -38,10 +52,10 @@ class ModelBackend(ModelBackend):
|
|||
return reduce(models.Q.__or__, queries)
|
||||
|
||||
def authenticate(self, username=None, password=None, realm=None, **kwargs):
|
||||
UserModel = get_user_model()
|
||||
UserModel = get_proxy_user_model()
|
||||
if username is None:
|
||||
username = kwargs.get(UserModel.USERNAME_FIELD)
|
||||
query = self.get_query(username, realm)
|
||||
for user in UserModel._default_manager.filter(query):
|
||||
for user in UserModel.objects.filter(query):
|
||||
if user.check_password(password):
|
||||
return user
|
||||
|
|
Loading…
Reference in New Issue