Kontrola dostępu: konta z uprawnieniami do zakładek i funkcji (PRE-27) #68
Reference in New Issue
Block a user
Delete Branch "feat/kontrola-dostepu"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Ekran „Konta" dla administratora: zakładanie, kasowanie, nadawanie uprawnień. Zestaw funkcji zależy od konta, a konto ograniczone widzi program kompletny — tylko mniejszy.
Podział na grupy
Ekrany (7 zakładek) — naturalna jednostka, bo to je widać w nawigacji: Horoskop, Interpretacje, Kalendarz, Synastria, Sygnifikatory, Skompiluj, Ustawienia.
Rozszerzenia — poziomy złożoności wewnątrz ekranów:
houses_compareextra_chartsadvanced_calcaiexportKonto bez
houses_comparedostaje horoskop w Whole Sign i nie wie, że systemów jest trzynaście.Nic nie zdradza, że jest więcej
Ten ostatni punkt znalazł test, nie przegląd kodu:
/docs,/redoci/openapi.jsonwypisują komplet tras, czyli spis wszystkich funkcji programu. Ochrona zakładek nic by nie dała, gdyby obok leżał ich katalog.Konto administracyjne
Zostaje w
APP_USER/APP_PASSWORD, jak było. Nie leży w pliku kont, więc nie da się go skasować ani ograniczyć z ekranu. Konto założone w pliku o tym samym loginie nie przesłoni administracyjnego — kolejność sprawdzania jest odwrotna, inaczej dałoby się odebrać uprawnienia jedynemu, kto może je nadawać. Uprawnienia administracyjnego nie da się też nadać z formularza: odsiewamy je wnormalise(), nie w handlerze.Gdzie leży granica
W handlerze, nie w szablonie. Ukrycie pola chroni przed przypadkiem, nie przed kimś, kto zna nazwy pól —
_limit_options()ścina opcje po stronie serwera, a test wysyła spreparowane żądanie zstations=true&zodiac=sidereal_lahiri&house_systems=koch, żeby potwierdzić, że nic z tego nie przechodzi.Mapa
trasa → uprawnieniejest jedna (features.ROUTES). Trasa bez wpisu wymaga administratora: przeoczenie ma zamykać, nie otwierać. Test idzie po trasach aplikacji, nie po wpisach mapy — inaczej potwierdzałby tylko sam siebie (i to on znalazł/docs).Przechowywanie
Plik JSON na własnym podkatalogu NFS, nie tam, gdzie bazy — zamontowanie całego udziału obeszłoby bokiem DAN-25. Hasła wyłącznie jako hash scrypt, tym samym mechanizmem co
APP_USERS. Zapis atomowy, bo przerwanie zapisu obcięłoby plik, czyli skasowało wszystkie konta naraz.⚠️ Wymaga wolumenu — osobny PR w repo
deploy(gałąźfeat/konta-prezentacja). Bez niego konta znikną przy restarcie poda.Weryfikacja
21 testów kontroli dostępu, w tym pełny obieg: administrator zakłada konto → osoba loguje się i dostaje dokładnie przyznany zestaw → odebranie uprawnienia działa od razu → skasowanie konta odcina logowanie. Suity: prezentacja 281, logika 342, render 41, dane 13.
Przy okazji przepisane trzy testy, które greppowały nawigację i
main.py— menu powstaje teraz z katalogu, więc szukanie sztywnych linków wbase.htmlniczego już nie sprawdzało.🤖 Generated with Claude Code