Commit 58cba437 authored by Hamza Dely's avatar Hamza Dely

Merge branch '21-login-via-idbde' into 'master'

Resolve "Login via idbde"

Closes #21

See merge request dely/note-kfet!2
parents 29c7a673 2a454307
......@@ -26,6 +26,7 @@ PSEUDO_REGEX = r"^(\S|\S+.*\S+)$" # Pas de leading/trailing spaces
# XXX : Limiter aussi le nombre maximal d'espaces consécutifs dans le pseudo ?
# |---> r"(\S|\S+(\S|\s{,n})*\S+)", avec n bien choisi ?
DELETED_REGEX = r"^__deleted__[0-9]+$" # Les pseudos en '__deleted__[0-9]+' sont réservés
ID_REGEX = r'^#[0-9]+$' # Les pseudos en '#<nombre>' sont réservés à l'identification via ID BdE
TELEPHONE_REGEX = r"^[0-9 -]+$"
class Section(models.Model):
......@@ -72,6 +73,7 @@ class Alias(models.Model):
null=False,
validators=[
RegexValidator(DELETED_REGEX, inverse_match=True),
RegexValidator(ID_REGEX, inverse_match=True),
RegexValidator(PSEUDO_REGEX),
]
)
......@@ -508,6 +510,7 @@ class Adherent(AbstractBaseUser):
blank=False,
null=False,
validators=[
RegexValidator(ID_REGEX, inverse_match=True),
RegexValidator(PSEUDO_REGEX),
],
)
......
......@@ -2,12 +2,16 @@
Backends utilisés avec la note pour la gestion des droits et des méta-droits
"""
import re
from django.contrib.auth import get_user_model
from django.contrib.auth.backends import ModelBackend
from django.contrib.contenttypes.models import ContentType
from note_kfet.droits import Acl, D
ID_AUTH_REGEX = re.compile(r'^#([0-9]+)')
UserModel = get_user_model()
class NoteBackend(ModelBackend):
......@@ -15,6 +19,21 @@ class NoteBackend(ModelBackend):
Un ModelBackend amélioré pour les besoins de la note, en
particulier pour implémenter la gestion des accréditations
"""
def authenticate(self, request, username=None, password=None, **kwargs):
"""
Permet d'authentifier un utilisateur à l'aide de son ID BdE
"""
m = ID_AUTH_REGEX.match(username or kwargs.get(UserModel.USERNAME_FIELD, ''))
if m is not None:
try:
user = UserModel.objects.get(id=int(m.group(1)))
username = getattr(user, UserModel.USERNAME_FIELD)
except UserModel.DoesNotExist:
UserModel().set_password(password)
return None
return super().authenticate(request, username=username, password=password, **kwargs)
def _get_user_permissions(self, user_obj):
return set(user_obj.accreditations.all())
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment