Opened 10 years ago
Last modified 10 years ago
#23925 closed Bug
django.contrib.auth.authenticate sets the wrong backend path — at Initial Version
Reported by: | sdeprez | Owned by: | nobody |
---|---|---|---|
Component: | contrib.auth | Version: | 1.7 |
Severity: | Normal | Keywords: | |
Cc: | sdeprez | Triage Stage: | Accepted |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
The django.contrib.auth.authenticate
function currently tries to authenticate a user by checking each backend in settings.AUTHENTICATION_BACKENDS
, and when it has found one that works, it annotates the user by adding a path
attribute that is the path of the backend (as a Python object). However the path is computed based on the __class__
attribute of the backend object, which give the "real" path of the object, and NOT based on the path given by settings.AUTHENTICATION_BACKENDS
.
This is problematic beacause they may differ, and thus the later check if backend_path in settings.AUTHENTICATION_BACKENDS
in django.contrib.auth.get_user
can fail whereas it should not.
Steps to reproduce the bug :
- create a custom backend in some module :
my_app.my_module_backend.CustomBackend
- create another module that imports this module. For instance, it's common practice to import it in the
__init__.py
file of the package. So, inmy_app/__init__.py
putfrom my_app import CustomBackend
.
- Set
AUTHENTICATION_BACKENDS = my_app.CustomBackend
- Run django, create an user and try to login. Everything will go fine (no errors), except that you WON'T be logged, because of
django.contrib.auth.get_user
that will return an AnonymousUser. This can be very painful to track and this can even lead to infinite loops if yourLOGIN_REDIRECT_URL
is an url that requires login, because the session key will be set but anAnonymousUser
is returned.
I attached a patch that fixes that, by setting the actual path used in AUTHENTICATION_BACKENDS
in the user, without any changes to the working public API.