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 test4@example.com 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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy