Skip to content

Commit aa6b904

Browse files
committed
Redirect superusers to /admin on login
Make this change for both Persona and CIS2 logins. The initial idea here was to also check for provider assignments and only redirect if none existed. I've opted to redirect regardless as it's trivial to navigate back to the app from the admin screen. I've also added 'next' param support for superusers to redirect back to a page on the service after Persona login if the superuser's session timed out.
1 parent cdfadee commit aa6b904

3 files changed

Lines changed: 61 additions & 5 deletions

File tree

manage_breast_screening/auth/demo_views.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818
@csrf_exempt
1919
@login_not_required
2020
def persona_login(request):
21-
next_path = extract_relative_redirect_url(
22-
request, parameter_name="next", default="/"
23-
)
21+
next_path = extract_relative_redirect_url(request, parameter_name="next")
22+
if next_path == "/":
23+
next_path = None
2424

2525
if request.method == "POST":
2626
try:
@@ -34,8 +34,8 @@ def persona_login(request):
3434
now = timezone.now()
3535
request.session["login_time"] = now.isoformat()
3636

37-
if request.user.is_superuser:
38-
redirect_url = next_path
37+
if request.user.is_superuser and not next_path:
38+
redirect_url = reverse("admin:index")
3939
else:
4040
redirect_url = reverse("select_provider")
4141
if next_path:

manage_breast_screening/auth/tests/test_views.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ def personas():
1818
nhs_uid=persona.username,
1919
first_name=persona.first_name,
2020
last_name=persona.last_name,
21+
is_superuser=persona.is_superuser,
2122
)
2223
UserAssignmentFactory(
2324
user=user,
@@ -51,6 +52,36 @@ def test_post_persona_login(client):
5152
assert response.headers["location"] == "/current-provider/select/?next=%2Fsome-url"
5253

5354

55+
@pytest.mark.django_db
56+
def test_post_persona_login_superuser_redirects_to_admin(client):
57+
response = client.post(
58+
reverse("auth:persona_login"),
59+
{"username": "priya_bains"},
60+
)
61+
assert response.status_code == 302
62+
assert response.headers["location"] == "/admin/"
63+
64+
65+
@pytest.mark.django_db
66+
def test_post_persona_login_superuser_with_root_next_redirects_to_admin(client):
67+
response = client.post(
68+
reverse("auth:persona_login"),
69+
{"username": "priya_bains", "next": "/"},
70+
)
71+
assert response.status_code == 302
72+
assert response.headers["location"] == "/admin/"
73+
74+
75+
@pytest.mark.django_db
76+
def test_post_persona_login_superuser_with_next_redirects_to_select_provider(client):
77+
response = client.post(
78+
reverse("auth:persona_login"),
79+
{"username": "priya_bains", "next": "/some-url"},
80+
)
81+
assert response.status_code == 302
82+
assert response.headers["location"] == "/current-provider/select/?next=%2Fsome-url"
83+
84+
5485
@pytest.mark.django_db
5586
@override_settings(CIS2_ACR_VALUES="some-test-acr-value")
5687
def test_cis2_login_uses_configured_acr_values(client, monkeypatch):
@@ -187,6 +218,7 @@ def test_accepts_valid_assurance_levels(
187218

188219
mock_user = Mock()
189220
mock_user.nhs_uid = "user-123"
221+
mock_user.is_superuser = False
190222
mock_authenticate = Mock(return_value=mock_user)
191223
mock_login = Mock()
192224

@@ -208,3 +240,24 @@ def test_accepts_valid_assurance_levels(
208240
ANY, cis2_sub="user-123", cis2_userinfo={"sub": "user-123"}
209241
)
210242
mock_login.assert_called_once_with(ANY, mock_user)
243+
244+
def test_superuser_redirects_to_admin(
245+
self, client, monkeypatch, mock_cis2_client_factory
246+
):
247+
"""Superusers should always be sent to the admin site after login."""
248+
mock_cis2_client_factory()
249+
250+
mock_user = Mock()
251+
mock_user.nhs_uid = "user-123"
252+
mock_user.is_superuser = True
253+
254+
monkeypatch.setattr(
255+
"manage_breast_screening.auth.views.authenticate",
256+
Mock(return_value=mock_user),
257+
)
258+
monkeypatch.setattr("manage_breast_screening.auth.views.auth_login", Mock())
259+
260+
response = client.get(reverse("auth:cis2_callback"))
261+
262+
assert response.status_code == 302
263+
assert response.headers["location"] == "/admin/"

manage_breast_screening/auth/views.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,9 @@ def cis2_callback(request):
115115
request.session["login_time"] = now.isoformat()
116116
request.session["last_activity"] = now.isoformat()
117117

118+
if user.is_superuser:
119+
return redirect(reverse("admin:index"))
120+
118121
return redirect(reverse("select_provider"))
119122

120123

0 commit comments

Comments
 (0)