Skip to content

Commit 0147222

Browse files
Fixed #37079 -- Fixed specialization of header lookups in RemoteUserMiddleware.
We need to switch on whether the request is a WSGI or ASGI request to know whether to prepend `HTTP_`: we cannot assume sync exceution means we are running under WSGI, as there could be other sync middleware forcing sync execution under ASGI. Thanks Mykhailo Havelia for the report.
1 parent f8c0a93 commit 0147222

2 files changed

Lines changed: 38 additions & 2 deletions

File tree

django/contrib/auth/middleware.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from django.contrib.auth.backends import RemoteUserBackend
99
from django.contrib.auth.views import redirect_to_login
1010
from django.core.exceptions import ImproperlyConfigured
11+
from django.core.handlers.asgi import ASGIRequest
1112
from django.shortcuts import resolve_url
1213
from django.utils.deprecation import MiddlewareMixin
1314
from django.utils.functional import SimpleLazyObject
@@ -141,7 +142,7 @@ def process_request(self, request):
141142
f" before the {self.__class__.__name__} class."
142143
)
143144
try:
144-
username = request.META[self.header]
145+
username = self._get_username(request)
145146
except KeyError:
146147
# If specified header doesn't exist then remove any existing
147148
# authenticated remote-user, or return (leaving request.user set to
@@ -183,7 +184,7 @@ async def aprocess_request(self, request):
183184
f" before the {self.__class__.__name__} class."
184185
)
185186
try:
186-
username = request.META["HTTP_" + self.header]
187+
username = self._get_username(request)
187188
except KeyError:
188189
# If specified header doesn't exist then remove any existing
189190
# authenticated remote-user, or return (leaving request.user set to
@@ -236,6 +237,11 @@ async def aclean_username(self, username, request):
236237
pass
237238
return username
238239

240+
def _get_username(self, request):
241+
if isinstance(request, ASGIRequest):
242+
return request.META["HTTP_" + self.header]
243+
return request.META[self.header]
244+
239245
def _remove_invalid_user(self, request):
240246
"""
241247
Remove the current authenticated user in the request which is invalid

tests/auth_tests/test_remote_user.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from datetime import UTC, datetime
22

3+
import asgiref.sync
4+
35
from django.conf import settings
46
from django.contrib.auth import aauthenticate, authenticate
57
from django.contrib.auth.backends import RemoteUserBackend
@@ -14,6 +16,15 @@
1416
modify_settings,
1517
override_settings,
1618
)
19+
from django.utils.decorators import sync_only_middleware
20+
21+
22+
@sync_only_middleware
23+
def sync_middleware(get_response):
24+
def middleware(request):
25+
return get_response(request)
26+
27+
return middleware
1728

1829

1930
@override_settings(ROOT_URLCONF="auth_tests.urls")
@@ -470,6 +481,20 @@ async def test_unknown_user_async(self):
470481
self.assertEqual(newuser.email, "user@example.com")
471482

472483

484+
class ASGISyncPathRemoteUserTest(RemoteUserTest):
485+
"""Later sync-only middleware forces sync execution even under ASGI."""
486+
487+
middleware = [
488+
RemoteUserTest.middleware,
489+
"auth_tests.test_remote_user.sync_middleware",
490+
]
491+
492+
def setUp(self):
493+
method = getattr(self, self._testMethodName)
494+
if not isinstance(method, asgiref.sync.AsyncToSync):
495+
self.skipTest("This test covers async-only functionality")
496+
497+
473498
class CustomHeaderMiddleware(RemoteUserMiddleware):
474499
"""
475500
Middleware that overrides custom HTTP auth user header.
@@ -488,6 +513,11 @@ class CustomHeaderRemoteUserTest(RemoteUserTest):
488513
header = "HTTP_AUTHUSER"
489514

490515

516+
class CustomHeaderASGISyncPathRemoteUserTest(ASGISyncPathRemoteUserTest):
517+
middleware = "auth_tests.test_remote_user.CustomHeaderMiddleware"
518+
header = "HTTP_AUTHUSER"
519+
520+
491521
class PersistentRemoteUserTest(RemoteUserTest):
492522
"""
493523
PersistentRemoteUserMiddleware keeps the user logged in even if the

0 commit comments

Comments
 (0)