1from opentelemetry import trace
2from opentelemetry.semconv._incubating.attributes.user_attributes import USER_ID
3
4from plain import auth
5from plain.exceptions import ImproperlyConfigured
6from plain.utils.functional import SimpleLazyObject
7
8
9def get_user(request):
10 if not hasattr(request, "_cached_user"):
11 request._cached_user = auth.get_user(request)
12 if request._cached_user:
13 trace.get_current_span().set_attribute(USER_ID, request._cached_user.id)
14 return request._cached_user
15
16
17class AuthenticationMiddleware:
18 def __init__(self, get_response):
19 self.get_response = get_response
20
21 def __call__(self, request):
22 if not hasattr(request, "session"):
23 raise ImproperlyConfigured(
24 "The Plain authentication middleware requires session "
25 "middleware to be installed. Edit your MIDDLEWARE setting to "
26 "insert "
27 "'plain.sessions.middleware.SessionMiddleware' before "
28 "'plain.auth.middleware.AuthenticationMiddleware'."
29 )
30
31 request.user = SimpleLazyObject(lambda: get_user(request))
32
33 return self.get_response(request)