models_backend: use a dynamic proxy user model

This commit is contained in:
Benjamin Dauvergne 2014-05-02 19:01:08 +02:00
parent 2a3a165f60
commit 00a896a708
1 changed files with 17 additions and 3 deletions

View File

@ -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