Source code for accounts.backend
""" This module implements the login function. This is customised to allow
users to login using either their email address or system_number.
"""
from django.contrib.auth import get_user_model
from django.contrib.auth.backends import ModelBackend
from logs.views import log_event
[docs]
class CobaltBackend(ModelBackend):
"""Custom backend to control user logins."""
[docs]
def authenticate(
self, request, username=None, password=None
): # pylint: disable=arguments-differ
"""method to authenticate users"""
user_model = get_user_model() # get the user model from the system
# Try email address, then username, then system_number
con_type = None # default is we don't know how they are connecting
user = user_model.objects.filter(email__iexact=username).order_by("id").first()
if user:
con_type = "email" # matched on email address
else:
try:
user = user_model.objects.get(username=username)
con_type = "username" # matched on username
except user_model.DoesNotExist:
user = None
if user is None:
log_event(
request=request,
user="Login",
severity="WARN",
source="Accounts",
sub_source="Login",
message="Login failed - unknown userid",
)
return None
# we have a matching user - try to login
if user.check_password(password):
log_event(
request=request,
user=user,
severity="INFO",
source="Accounts",
sub_source="Login",
message="Logged in using %s" % con_type,
)
return user
else:
log_event(
request=request,
user="login",
severity="INFO",
source="Accounts",
sub_source="Login",
message="Login failed for %s - incorrect password" % username,
)
return None