Skip to content

Commit 5503435

Browse files
mpasternakclaude
andcommitted
fix(security): tryb wielokatalogowy Microsoft tylko dla kont już powiązanych
Bez konkretnego MICROSOFT_AUTH_TENANT_ID logują się wyłącznie konta Microsoft już powiązane z kontem BPP: bez zakładania nowych kont i bez wiązania po adresie e-mail (także dla kont bez uprawnień), z neutralnym komunikatem dla użytkownika. Jawny opt-in MICROSOFT_AUTH_MULTI_TENANT_ALLOW_LINKING=True przywraca ostrożne reguły wiązania. Treść bpp.W201 i komunikatu dla superusera opisuje ten tryb. Przy konkretnym tenancie zachowanie bez zmian. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UJ23Rb1c5UtxHTfAke9ENQ
1 parent 4ce6391 commit 5503435

7 files changed

Lines changed: 197 additions & 36 deletions

File tree

‎docs/administrator/zaawansowane.md‎

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ zmiennych `MICROSOFT_AUTH_CLIENT_ID` oraz `MICROSOFT_AUTH_CLIENT_SECRET`.
206206
| `MICROSOFT_AUTH_CLIENT_SECRET` | Sekret tej aplikacji. |
207207
| `MICROSOFT_AUTH_TENANT_ID` | **Zalecany.** Identyfikator katalogu (GUID) albo jego domena, np. `uczelnia.onmicrosoft.com`. |
208208
| `MICROSOFT_AUTH_LINK_BY_EMAIL` | Domyślnie `False`. Patrz niżej. |
209+
| `MICROSOFT_AUTH_MULTI_TENANT_ALLOW_LINKING` | Domyślnie `False`. Dotyczy tylko trybu bez konkretnego katalogu. Patrz niżej. |
209210
| `MICROSOFT_AUTH_EXTRA_SCOPES` | Dodatkowe zakresy OAuth (opcjonalnie). |
210211

211212
### Zalecany konkretny katalog (tenant)
@@ -223,12 +224,23 @@ pusty albo ma wartość `common`, `organizations` lub `consumers`, BPP
223224
(dla `common` i `consumers` także prywatne konta Microsoft), o ile
224225
rejestracja aplikacji w Entra ID na to pozwala; BPP nie sprawdza, z którego
225226
katalogu pochodzi token,
226-
- zasady wiązania kont opisane niżej obowiązują bez zmian,
227+
- logują się **wyłącznie konta Microsoft już powiązane** z kontem BPP;
228+
BPP nie zakłada nowych kont i nie wiąże kont po adresie e-mail (także
229+
zwykłych kont bez uprawnień), bo w tym trybie adresu e-mail z tokenu nie da
230+
się zweryfikować; użytkownik niepowiązanego konta zobaczy komunikat
231+
„Konto Microsoft nie jest powiązane z kontem w BPP — skontaktuj się
232+
z administratorem”, a administrator może powiązać konto ręcznie w module
233+
administracyjnym (*Microsoft accounts*),
234+
- `MICROSOFT_AUTH_MULTI_TENANT_ALLOW_LINKING=True` przywraca w tym trybie
235+
zakładanie nowych kont i wiązanie po e-mailu według zasad opisanych niżej
236+
(konta z uprawnieniami lub hasłem lokalnym nadal nie są wiązane
237+
automatycznie) — używaj tylko świadomie,
227238
- `manage.py check` zgłasza ostrzeżenie `bpp.W201`, a superuser po każdym
228239
zalogowaniu widzi komunikat z tą samą podpowiedzią.
229240

230-
Aby usunąć ostrzeżenie, ustaw `MICROSOFT_AUTH_TENANT_ID` (GUID albo domena
231-
katalogu) i zrestartuj serwer aplikacji.
241+
Aby usunąć ostrzeżenie i przywrócić zwykłe zakładanie oraz wiązanie kont,
242+
ustaw `MICROSOFT_AUTH_TENANT_ID` (GUID albo domena katalogu) i zrestartuj
243+
serwer aplikacji.
232244

233245
### Wiązanie kont Microsoft z istniejącymi kontami BPP
234246

@@ -244,8 +256,9 @@ powiąże automatycznie konta Microsoft z istniejącym użytkownikiem, który:
244256
Takie logowanie zostanie odrzucone. Administrator może powiązać konto ręcznie
245257
w module administracyjnym (*Microsoft accounts*), albo — jeżeli adresy e-mail
246258
w katalogu są w pełni zaufane — ustawić `MICROSOFT_AUTH_LINK_BY_EMAIL=True`.
247-
Zwykłe konta bez hasła lokalnego oraz nowi użytkownicy są wiązani/zakładani
248-
automatycznie, jak dotychczas.
259+
Przy skonfigurowanym konkretnym katalogu zwykłe konta bez hasła lokalnego oraz
260+
nowi użytkownicy są wiązani/zakładani automatycznie, jak dotychczas (w trybie
261+
wielokatalogowym — patrz wyżej).
249262

250263
Konta Microsoft **już powiązane** z użytkownikiem BPP logują się bez zmian.
251264
Po aktualizacji użytkownicy zalogowani przez Microsoft muszą jednorazowo

‎src/bpp/auth/microsoft.py‎

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
* przy ustawionym konkretnym katalogu Entra ID (GUID lub domena) przyjmuje
66
wyłącznie tokeny wystawione przez ten katalog (claimy ``iss``/``tid``);
77
bez konkretnego katalogu (``common``/``organizations``/``consumers`` lub
8-
pusty) działa w trybie wielokatalogowym, jak biblioteka — tę konfigurację
9-
zgłasza system check ``bpp.W201``,
8+
pusty) działa w trybie wielokatalogowym — tę konfigurację zgłasza system
9+
check ``bpp.W201``; w tym trybie logują się wyłącznie konta Microsoft już
10+
powiązane z kontem BPP (bez wiązania po e-mailu i bez zakładania nowych
11+
kont), chyba że ``MICROSOFT_AUTH_MULTI_TENANT_ALLOW_LINKING = True``,
1012
* nie wiąże nowego konta Microsoft z kontem BPP, gdy token nie ma e-maila
1113
albo e-mail pasuje do więcej niż jednego konta,
1214
* nie wiąże automatycznie nowego konta Microsoft z istniejącym kontem
@@ -19,6 +21,7 @@
1921
import logging
2022

2123
from django.conf import settings
24+
from django.contrib import messages
2225
from django.contrib.auth import get_user_model
2326
from django.core.cache import cache
2427
from microsoft_auth.backends import MicrosoftAuthenticationBackend
@@ -33,8 +36,42 @@
3336

3437
logger = logging.getLogger(__name__)
3538

39+
#: Komunikat dla użytkownika, gdy konto Microsoft nie jest powiązane z BPP.
40+
KOMUNIKAT_NIEPOWIAZANE = (
41+
"Konto Microsoft nie jest powiązane z kontem w BPP — skontaktuj się "
42+
"z administratorem."
43+
)
44+
3645

3746
class BppMicrosoftAuthenticationBackend(MicrosoftAuthenticationBackend):
47+
def authenticate(self, request, code=None):
48+
self._request = request
49+
return super().authenticate(request, code=code)
50+
51+
def _odmowa_niepowiazane(self):
52+
request = getattr(self, "_request", None)
53+
if request is not None:
54+
messages.error(request, KOMUNIKAT_NIEPOWIAZANE, fail_silently=True)
55+
return None
56+
57+
def _get_linked_user_only(self, claims):
58+
"""Tryb wielokatalogowy bez opt-in: tylko konta już powiązane."""
59+
from microsoft_auth.models import MicrosoftAccount
60+
61+
account = (
62+
MicrosoftAccount.objects.filter(microsoft_id=claims.get("sub"))
63+
.select_related("user")
64+
.first()
65+
)
66+
if account is not None and account.user is not None:
67+
return account.user
68+
logger.warning(
69+
"Odrzucono logowanie Microsoft (tryb wielokatalogowy): konto "
70+
"%r nie jest powiązane z użytkownikiem BPP.",
71+
claims.get("sub"),
72+
)
73+
return self._odmowa_niepowiazane()
74+
3875
def _expected_issuer(self, tenant_id):
3976
issuer = (self.microsoft.openid_config or {}).get("issuer") or ""
4077
if self._issuer_is_stale(issuer, tenant_id):
@@ -63,7 +100,12 @@ def _authenticate_microsoft_user(self):
63100
if is_multi_tenant(tenant_id):
64101
# Tryb wielokatalogowy: nie ma katalogu, względem którego można
65102
# sprawdzić iss/tid (podpis i audience sprawdza biblioteka).
66-
# Ostrożne wiązanie kont w _verify_microsoft_user obowiązuje dalej.
103+
# Adres e-mail w tokenie nie jest wtedy wiarygodny — bez jawnego
104+
# opt-in logują się wyłącznie konta już powiązane.
105+
if not getattr(
106+
settings, "MICROSOFT_AUTH_MULTI_TENANT_ALLOW_LINKING", False
107+
):
108+
return self._get_linked_user_only(claims)
67109
return self._get_user_from_microsoft(claims)
68110

69111
expected_issuer = self._expected_issuer(tenant_id)
@@ -108,7 +150,7 @@ def _verify_microsoft_user(self, microsoft_user, data):
108150
"Odrzucono logowanie Microsoft %r: token bez adresu e-mail.",
109151
microsoft_user.microsoft_id,
110152
)
111-
return None
153+
return self._odmowa_niepowiazane()
112154

113155
User = get_user_model()
114156
matching = list(User.objects.filter(email__iexact=email)[:2])
@@ -120,7 +162,7 @@ def _verify_microsoft_user(self, microsoft_user, data):
120162
"w adminie lub ustaw MICROSOFT_AUTH_LINK_BY_EMAIL.",
121163
microsoft_user.microsoft_id,
122164
)
123-
return None
165+
return self._odmowa_niepowiazane()
124166

125167
first_name, last_name = self._split_name(data.get("name"))
126168

‎src/bpp/auth/microsoft_conf.py‎

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def is_multi_tenant(tenant_id):
4545
return not value or value in MULTI_TENANT_VALUES
4646

4747

48-
def microsoft_tenant_warning(client_id, tenant_id):
48+
def microsoft_tenant_warning(client_id, tenant_id, allow_linking=False):
4949
"""Treść ostrzeżenia o braku konkretnego tenanta albo ``None``.
5050
5151
Ostrzeżenie dotyczy wyłącznie instalacji z włączonym logowaniem Microsoft
@@ -54,19 +54,30 @@ def microsoft_tenant_warning(client_id, tenant_id):
5454
if not client_id or not is_multi_tenant(tenant_id):
5555
return None
5656
shown = (tenant_id or "").strip() or "(pusty)"
57-
return (
58-
"Logowanie przez Microsoft działa w trybie wielokatalogowym: "
59-
f"MICROSOFT_AUTH_TENANT_ID = {shown}. Konta Microsoft z dowolnego "
60-
"katalogu Entra ID mogą przejść przez logowanie, a BPP nie sprawdza, "
61-
"z którego katalogu pochodzi token."
57+
tresc = (
58+
"Logowanie przez Microsoft działa w trybie wielokatalogowym "
59+
f"(MICROSOFT_AUTH_TENANT_ID = {shown}): BPP nie sprawdza, z którego "
60+
"katalogu Entra ID pochodzi token."
61+
)
62+
if allow_linking:
63+
return tresc + (
64+
" Włączono MICROSOFT_AUTH_MULTI_TENANT_ALLOW_LINKING — nowe konta "
65+
"Microsoft są zakładane i wiązane po adresie e-mail, którego "
66+
"w tym trybie nie da się zweryfikować."
67+
)
68+
return tresc + (
69+
" Logują się wyłącznie konta Microsoft już powiązane z kontem BPP; "
70+
"zakładanie nowych kont i wiązanie po adresie e-mail są wyłączone."
6271
)
6372

6473

6574
#: Podpowiedź dołączana do ostrzeżenia (system check i komunikat po logowaniu).
6675
TENANT_HINT = (
6776
"Ustaw MICROSOFT_AUTH_TENANT_ID na identyfikator katalogu uczelni (GUID, "
6877
"portal Azure: Microsoft Entra ID -> Przegląd -> Identyfikator dzierżawy) "
69-
"albo jego domenę, np. uczelnia.onmicrosoft.com, i zrestartuj serwer."
78+
"albo jego domenę, np. uczelnia.onmicrosoft.com, i zrestartuj serwer — "
79+
"wtedy działa pełna weryfikacja katalogu, a zakładanie i wiązanie kont "
80+
"wracają do zwykłych reguł."
7081
)
7182

7283

@@ -86,6 +97,7 @@ def ostrzez_superusera_o_tenancie_microsoft(sender, request, user, **kwargs):
8697
tresc = microsoft_tenant_warning(
8798
getattr(settings, "MICROSOFT_AUTH_CLIENT_ID", None),
8899
getattr(settings, "MICROSOFT_AUTH_TENANT_ID", None),
100+
getattr(settings, "MICROSOFT_AUTH_MULTI_TENANT_ALLOW_LINKING", False),
89101
)
90102
if tresc:
91103
messages.warning(request, f"{tresc} {TENANT_HINT}", fail_silently=True)

‎src/bpp/checks.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ def microsoft_tenant_check(app_configs, **kwargs):
182182
tresc = microsoft_tenant_warning(
183183
getattr(settings, "MICROSOFT_AUTH_CLIENT_ID", None),
184184
getattr(settings, "MICROSOFT_AUTH_TENANT_ID", None),
185+
getattr(settings, "MICROSOFT_AUTH_MULTI_TENANT_ALLOW_LINKING", False),
185186
)
186187
if not tresc:
187188
return []
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Wzmocniono zabezpieczenia logowania przez Microsoft (Office 365): przy ustawionym konkretnym katalogu Entra ID (``MICROSOFT_AUTH_TENANT_ID``) weryfikowane są claimy ``iss``/``tid`` tokenu, brak konkretnego katalogu (pusty, ``common``, ``organizations``, ``consumers``) zgłaszany jest ostrzeżeniem ``bpp.W201`` i komunikatem dla superusera po zalogowaniu, a nowe konto Microsoft nie jest automatycznie wiązane po adresie e-mail z istniejącym kontem administracyjnym lub posiadającym hasło lokalne (chyba że ``MICROSOFT_AUTH_LINK_BY_EMAIL=True``).
1+
Wzmocniono zabezpieczenia logowania przez Microsoft (Office 365): przy ustawionym konkretnym katalogu Entra ID (``MICROSOFT_AUTH_TENANT_ID``) weryfikowane są claimy ``iss``/``tid`` tokenu; bez konkretnego katalogu (pusty, ``common``, ``organizations``, ``consumers``) serwer startuje, ale zgłaszane jest ostrzeżenie ``bpp.W201`` i komunikat dla superusera po zalogowaniu, a logować mogą się wyłącznie konta Microsoft już powiązane z kontem BPP (bez zakładania nowych kont i wiązania po e-mailu, chyba że ``MICROSOFT_AUTH_MULTI_TENANT_ALLOW_LINKING=True``); nowe konto Microsoft nie jest automatycznie wiązane po adresie e-mail z istniejącym kontem administracyjnym lub posiadającym hasło lokalne (chyba że ``MICROSOFT_AUTH_LINK_BY_EMAIL=True``).

‎src/bpp/tests/test_auth_microsoft.py‎

Lines changed: 105 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,18 @@ def test_check_ostrzega_przy_braku_konkretnego_tenanta(tenant):
6868
assert isinstance(wynik[0], checks.Warning)
6969
assert "MICROSOFT_AUTH_TENANT_ID" in wynik[0].hint
7070
assert "onmicrosoft.com" in wynik[0].hint
71+
assert "wiązanie po adresie e-mail są wyłączone" in wynik[0].msg
72+
73+
74+
def test_check_opt_in_wspomina_o_wlaczonym_wiazaniu():
75+
with override_settings(
76+
MICROSOFT_AUTH_CLIENT_ID="client-id",
77+
MICROSOFT_AUTH_TENANT_ID="common",
78+
MICROSOFT_AUTH_MULTI_TENANT_ALLOW_LINKING=True,
79+
):
80+
wynik = microsoft_tenant_check(None)
81+
assert [w.id for w in wynik] == ["bpp.W201"]
82+
assert "MICROSOFT_AUTH_MULTI_TENANT_ALLOW_LINKING" in wynik[0].msg
7183

7284

7385
@pytest.mark.parametrize("tenant", [TENANT, "uczelnia.onmicrosoft.com"])
@@ -83,6 +95,21 @@ def test_check_brak_ostrzezenia_bez_logowania_microsoft():
8395
assert microsoft_tenant_check(None) == []
8496

8597

98+
@pytest.mark.uruchom_tylko_z_microsoft_auth
99+
def test_check_z_rzeczywistych_ustawien():
100+
# Bez override_settings: ustawienia z env (MICROSOFT_AUTH_TENANT_ID)
101+
# po normalizacji w settings/base.py.
102+
from django.conf import settings
103+
104+
from bpp.auth.microsoft_conf import is_multi_tenant
105+
106+
wynik = microsoft_tenant_check(None)
107+
if is_multi_tenant(settings.MICROSOFT_AUTH_TENANT_ID):
108+
assert [w.id for w in wynik] == ["bpp.W201"]
109+
else:
110+
assert wynik == []
111+
112+
86113
def test_check_zarejestrowany():
87114
assert microsoft_tenant_check in checks.registry.registry.get_checks()
88115

@@ -111,9 +138,10 @@ def test_superuser_po_zalogowaniu_dostaje_ostrzezenie(client):
111138
username="szef", password=HASLO, email="szef@example.com"
112139
)
113140
komunikaty = _komunikaty(_zaloguj(client, "szef"))
114-
assert any(OSTRZEZENIE in m and "onmicrosoft.com" in m for m in komunikaty), (
115-
komunikaty
116-
)
141+
assert any(
142+
OSTRZEZENIE in m and "onmicrosoft.com" in m and "są wyłączone" in m
143+
for m in komunikaty
144+
), komunikaty
117145

118146

119147
@pytest.mark.django_db
@@ -457,6 +485,8 @@ def openid_config(self):
457485

458486
# --- backend w trybie wielokatalogowym (brak konkretnego tenanta) -----------
459487

488+
TEMPLATE_ISSUER = "https://login.microsoftonline.com/{tenantid}/v2.0"
489+
460490

461491
@pytest.mark.uruchom_tylko_z_microsoft_auth
462492
@pytest.mark.django_db
@@ -468,45 +498,102 @@ def test_backend_tryb_wielokatalogowy_loguje_powiazane_konto(tenant):
468498
baker.make(MicrosoftAccount, microsoft_id="ms-sub-1", user=user)
469499

470500
backend = _backend(
471-
_claims(tid=OTHER_TENANT, iss=OTHER_ISSUER),
472-
issuer="https://login.microsoftonline.com/{tenantid}/v2.0",
501+
_claims(tid=OTHER_TENANT, iss=OTHER_ISSUER), issuer=TEMPLATE_ISSUER
473502
)
474503
with override_settings(MICROSOFT_AUTH_TENANT_ID=tenant):
475504
assert backend._authenticate_microsoft_user() == user
476505

477506

478507
@pytest.mark.uruchom_tylko_z_microsoft_auth
479508
@pytest.mark.django_db
480-
@override_settings(
481-
MICROSOFT_AUTH_TENANT_ID="common", MICROSOFT_AUTH_LINK_BY_EMAIL=False
509+
@override_settings(MICROSOFT_AUTH_TENANT_ID="common", MICROSOFT_AUTH_LINK_BY_EMAIL=True)
510+
@pytest.mark.parametrize(
511+
"attrs",
512+
[{}, {"is_staff": True}, {"is_superuser": True}],
513+
ids=["zwykle", "staff", "superuser"],
482514
)
483-
@pytest.mark.parametrize("attrs", [{"is_staff": True}, {"is_superuser": True}])
484-
def test_backend_tryb_wielokatalogowy_nie_wiaze_konta_staff(attrs):
515+
def test_backend_tryb_wielokatalogowy_nie_wiaze_po_emailu(attrs):
485516
from microsoft_auth.models import MicrosoftAccount
486517

487518
konto = baker.make(get_user_model(), email="jan@example.com", password="", **attrs)
519+
liczba = get_user_model().objects.count()
520+
488521
backend = _backend(_claims(tid=OTHER_TENANT, iss=OTHER_ISSUER))
489522
assert backend._authenticate_microsoft_user() is None
490523
assert not MicrosoftAccount.objects.filter(user=konto).exists()
524+
assert not MicrosoftAccount.objects.filter(microsoft_id="ms-sub-1").exists()
525+
assert get_user_model().objects.count() == liczba
491526

492527

493528
@pytest.mark.uruchom_tylko_z_microsoft_auth
494529
@pytest.mark.django_db
495-
@override_settings(
496-
MICROSOFT_AUTH_TENANT_ID="common", MICROSOFT_AUTH_LINK_BY_EMAIL=False
497-
)
498-
def test_backend_tryb_wielokatalogowy_nie_wiaze_konta_z_haslem():
499-
konto = baker.make(get_user_model(), email="jan@example.com")
500-
konto.set_password(HASLO)
501-
konto.save()
502-
backend = _backend(_claims())
530+
@override_settings(MICROSOFT_AUTH_TENANT_ID="common", MICROSOFT_AUTH_AUTO_CREATE=True)
531+
def test_backend_tryb_wielokatalogowy_nie_zaklada_nowego_konta():
532+
from microsoft_auth.models import MicrosoftAccount
533+
534+
liczba = get_user_model().objects.count()
535+
backend = _backend(_claims(email="nowy@example.com", sub="ms-sub-nowy"))
503536
assert backend._authenticate_microsoft_user() is None
537+
assert get_user_model().objects.count() == liczba
538+
assert not MicrosoftAccount.objects.filter(microsoft_id="ms-sub-nowy").exists()
504539

505540

506541
@pytest.mark.uruchom_tylko_z_microsoft_auth
507542
@pytest.mark.django_db
508543
@override_settings(MICROSOFT_AUTH_TENANT_ID="common")
509-
def test_backend_tryb_wielokatalogowy_odmawia_przy_pustym_lub_wieloznacznym_emailu():
544+
def test_backend_tryb_wielokatalogowy_odmowa_z_neutralnym_komunikatem(rf):
545+
from django.contrib.messages.storage.fallback import FallbackStorage
546+
547+
from bpp.auth.microsoft import KOMUNIKAT_NIEPOWIAZANE
548+
549+
request = rf.get("/microsoft/auth-callback/")
550+
request.session = {}
551+
request._messages = FallbackStorage(request)
552+
553+
backend = _backend(_claims(email="nowy@example.com", sub="ms-sub-nowy"))
554+
backend._request = request
555+
assert backend._authenticate_microsoft_user() is None
556+
assert [str(m) for m in request._messages] == [KOMUNIKAT_NIEPOWIAZANE]
557+
558+
559+
@pytest.mark.uruchom_tylko_z_microsoft_auth
560+
@pytest.mark.django_db
561+
@override_settings(
562+
MICROSOFT_AUTH_TENANT_ID="common", MICROSOFT_AUTH_MULTI_TENANT_ALLOW_LINKING=True
563+
)
564+
def test_backend_opt_in_zaklada_nowe_konto_i_wiaze_zwykle():
565+
nowy = _backend(
566+
_claims(email="nowy@example.com", sub="ms-sub-nowy")
567+
)._authenticate_microsoft_user()
568+
assert nowy is not None
569+
assert nowy.email == "nowy@example.com"
570+
571+
zwykle = baker.make(get_user_model(), email="jan@example.com", password="")
572+
assert _backend(_claims())._authenticate_microsoft_user() == zwykle
573+
574+
575+
@pytest.mark.uruchom_tylko_z_microsoft_auth
576+
@pytest.mark.django_db
577+
@override_settings(
578+
MICROSOFT_AUTH_TENANT_ID="common",
579+
MICROSOFT_AUTH_MULTI_TENANT_ALLOW_LINKING=True,
580+
MICROSOFT_AUTH_LINK_BY_EMAIL=False,
581+
)
582+
@pytest.mark.parametrize("attrs", [{"is_staff": True}, {"is_superuser": True}])
583+
def test_backend_opt_in_nadal_nie_wiaze_konta_staff(attrs):
584+
from microsoft_auth.models import MicrosoftAccount
585+
586+
konto = baker.make(get_user_model(), email="jan@example.com", password="", **attrs)
587+
assert _backend(_claims())._authenticate_microsoft_user() is None
588+
assert not MicrosoftAccount.objects.filter(user=konto).exists()
589+
590+
591+
@pytest.mark.uruchom_tylko_z_microsoft_auth
592+
@pytest.mark.django_db
593+
@override_settings(
594+
MICROSOFT_AUTH_TENANT_ID="common", MICROSOFT_AUTH_MULTI_TENANT_ALLOW_LINKING=True
595+
)
596+
def test_backend_opt_in_odmawia_przy_pustym_lub_wieloznacznym_emailu():
510597
baker.make(get_user_model(), email="jan@example.com", password="", _quantity=2)
511598
liczba = get_user_model().objects.count()
512599
assert _backend(_claims(email=""))._authenticate_microsoft_user() is None

0 commit comments

Comments
 (0)