Skip to content

Commit 2239a1c

Browse files
committed
Add support for Django 5.1 and LoginRequiredMiddleware
1 parent 76e61a4 commit 2239a1c

File tree

5 files changed

+46
-1
lines changed

5 files changed

+46
-1
lines changed

CHANGELOG.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ Next version
1111
``has_perm`` is an acceptable fallback.
1212
- Force account selection when failing to authenticate once in the Django admin
1313
using a Google account.
14+
- Added support for Django 5.1.
15+
- Exempted our login views from the ``LoginRequiredMiddleware``.
1416

1517

1618
0.16 (2023-09-17)

authlib/_compat.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
__all__ = ["login_not_required"]
2+
3+
4+
try:
5+
from django.contrib.auth.decorators import login_not_required
6+
except ImportError:
7+
# For Django < 5.1, copy the current Django implementation
8+
def login_not_required(view_func):
9+
"""
10+
Decorator for views that allows access to unauthenticated requests.
11+
"""
12+
view_func.login_required = False
13+
return view_func

authlib/views.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from django.views.decorators.cache import never_cache
1313
from django.views.decorators.debug import sensitive_post_parameters
1414

15+
from authlib._compat import login_not_required
1516
from authlib.email import decode, send_registration_mail
1617

1718

@@ -69,6 +70,7 @@ def email_login(request, *, email, **kwargs):
6970
return None, None
7071

7172

73+
@login_not_required
7274
@never_cache
7375
@sensitive_post_parameters()
7476
@set_next_cookie
@@ -88,6 +90,7 @@ def login(
8890
return render(request, template_name, {"form": form})
8991

9092

93+
@login_not_required
9194
@never_cache
9295
def oauth2(
9396
request,
@@ -155,6 +158,7 @@ def send_mail(self, **kwargs):
155158
)
156159

157160

161+
@login_not_required
158162
@never_cache
159163
def email_registration(
160164
request,
@@ -191,6 +195,7 @@ def email_registration(
191195
return redirect("login")
192196

193197

198+
@login_not_required
194199
@never_cache
195200
def logout(request, *, post_logout_response=post_logout_response):
196201
auth.logout(request)

tests/testapp/test_authlib.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,29 @@
11
import base64
22
import json
33
from contextlib import contextmanager
4+
from unittest import skipUnless
45
from unittest.mock import patch
56
from urllib.parse import parse_qsl, urlparse
67

78
import requests_mock
89
from django.test import Client, TestCase
9-
from django.test.utils import isolate_apps
10+
from django.test.utils import isolate_apps, modify_settings
1011
from django.utils.translation import deactivate_all
1112

1213
from authlib.base_user import BaseUser
1314
from authlib.facebook import FacebookOAuth2Client
1415
from authlib.little_auth.models import User
1516

1617

18+
try:
19+
from django.contrib.auth.middleware import LoginRequiredMiddleware # noqa: F401
20+
21+
has_login_required_middleware = True
22+
except ImportError:
23+
# Django < 5.1
24+
has_login_required_middleware = False
25+
26+
1727
@contextmanager
1828
def google_oauth_data(data):
1929
with requests_mock.Mocker() as m:
@@ -274,3 +284,17 @@ def test_oauth2_inactive(self):
274284
self.assertEqual(
275285
messages, ["No active user with email address [email protected] found."]
276286
)
287+
288+
@skipUnless(
289+
has_login_required_middleware, "LoginRequiredMiddleware needs Django 5.1+"
290+
)
291+
@modify_settings(
292+
MIDDLEWARE={"append": "django.contrib.auth.middleware.LoginRequiredMiddleware"}
293+
)
294+
def test_login_not_required(self):
295+
client = Client()
296+
response = client.get("/login/")
297+
self.assertEqual(response.status_code, 200)
298+
299+
response = client.get("/email/")
300+
self.assertEqual(response.status_code, 200)

tox.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ deps =
1515
dj41: Django>=4.1,<4.2
1616
dj42: Django>=4.2,<5.0
1717
dj50: Django>=5.0,<5.1
18+
dj51: Django>=5.1,<5.2
1819
djmain: https://github.com/django/django/archive/main.tar.gz
1920

2021
[testenv:docs]

0 commit comments

Comments
 (0)