Koncepcyjnie - system subroli na jednym koncie

0

Mamy standardową autoryzację, zalogowanego użytkownika i jest ok. Przychodzi taki moment, że jedna osoba spełnia kilka ról, które się różnią znacząco pod względem zakresu funkcji i dostępu do zasobów. Weźmy za przykład dziennik szkoły gdzie user Jan Kowalski jest skrajnym przypadkiem, że jest nauczycielem wf, uczniem szkoły wieczorowej oraz ma 3jkę dzieci w tym 2 z nich w jednej klasie. Oczywiście wszystko na jednym loginie i haśle.

Jakie mechanizmy, patterny byście użyli dla takiej sytuacji? W jaki sposób przechowywać role, rozróżniać, trzymać w sesji, autoryzować, wybierać domyślne itp? Miałem okazję już wdrażać takich mechanizm, ale chce podejść do tematu na świeżo, bo pozornie prosta sprawa wcale taka nie jest.

1

Rola w obrębie szkoły (klasy) a nie w obrębie systemu. Tabela gdzie masz many to many (szkoła <-> user) z dodatkową kolumną role_id. Autoryzacja pod konkretne endpointy, może być przez middlewary lub policy, albo mix obu (najbardziej prawdopodobny scenariusz, że potrzebne będą oba)

0

Zależy mi aby na jednym loginie miał dostęp nawet do dwóch szkół. Wiem, że w obecnych rozwiązaniach w szkołach nie ma takiej opcji, nie ma pewnie nawet możliwości aby być w ramach jednej szkoły rodzicem i nauczycielem, ale przykład ze szkołą jest tu abstrakcją tylko.

Czyli przewidujesz osobną tabelę na role? Co dokładnie ma oznaczać role_id? Tabela słownikowa? A jak określisz role_id dla roli teacher klasy A i teacher klasy B?

1

No to ci podałem właśnie, że rola jest w obrębie szkoły lub klasy zależnie jak ma być lub jednego i drugiego, wtedy można mieć jedno konto być przypisanym do wielu szkół i wszędzie mieć inne role. czym jest role_id? jakąś relacją do tabelki roles gdzie masz listę ról.

Edit: Rola to po prostu nauczyciel i tyle, ktoś jest przypisany do szkoły X i ma rolę nauczyciel.

0

No ale np. rola parent (rodzic) nie jest przypisana ani do szkoły, ani do klasy, nawet nie do ucznia, a bardziej usera bo obiekt ucznia, zmienia się z roku na rok np. jego numer w dzienniku i inne parametry. Więc przewidywałbyś aby ta tabela z rolami miała tyle kolumn ile możliwych relacji, albo polimorficzną relację?

Tak żeby obrazując, w górnym prawym rogu po zalogowaniu do systemu Jan Kowalski, który ma dość bogate życie prywatno-zawodowe ma:
[ wychowawca klasy A ]
[ nauczyciel wf w szkole A (ogólna rola w szkole) ]
[ uczeń w szkole wieczorowej B ]
[ rodzic dziecka A w szkole A klasie B ]
[ rodzic dziecka B w szkole A klasie B ]
[ rodzic dziecka C w szkole A klasie C ]
[ dyrektor szkoły C ]

0

Rola rodzic to byt poza wszystkim i jest do tylko relacja user <-> user (dziecko <-> rodzic) a odbywa się poprzez po prostu parent_id w tabelce users + dodatkowo musi dostać dotęp do szkoły więc jest po prostu wpięty do szkoły tak jak pozostałe osoby.

Edit: można zawsze dodać wiele ról do jednej osoby w szkole.

1

rola | klasa | szkola | obiekt

rodzic | A | B |C
wychowawca | A | A
nauczyciel | B | C

itp. tylko ze antywzorzec EAV tu by się pojawił w kolumnie obiekt

0

Ok, powiedzmy że mamy taką strukturę.

Relacje jeden do wielu: user + rola - szkoła. Ta lista nie ma póki co zbytnio praktycznego zastosowania. Jak wylistuje jego role to na powyższym przykładzie wyświetli mi:
[ nauczyciel w szkole A ]
[ uczeń w szkole B ]
[ rodzic w szkole A ]
[ dyrektor w szkole C ]

Wygląda fajnie, ale to jeszcze nie koniec. Wczytuje powiedzmy rolę rodzic w szkole A, i który dziennik mi wyświetli, którego dziecka? Albo jak wczytam rolę nauczyciela w szkole A to także ta rola jest zbyt ogólna. Co dalej?

0

no nie, bo najpierw wchodzisz do konkretnej szkoły i wtedy możesz sobie wyświetlić jakś plansze "nauczyciel", "moje dzieci" itp i wtedy robisz czynności tylko w konkretnej roli. Ja generalnie tu nie widze problemu, nie jest to na 5 minut ale robiłem gorsze zawiłości więc nie jest to nic wielkiego np robiłem system gdzie jest firma, w tej firmie sa pracownicy właściciele, managerowie, itp dalej masz projekty i tak dalej na różnych poziomach różne role. User w jednej firmie właścicielem w innej zwykłym pracownikiem, tu ma dostep do projektu jako pracownik tam jako manager a w 3 projekcie tylko jako klient. Ważne tu jest by potrafić wydzielić w którym momencie jestem gdzie i co mam zrobić.

0

Żeby podbić temat jeszcze od innej strony poruszę problem - przechowanie aktywnego state. Sesja, url, mix czy coś innego?
Przez url rozumiem przekazywanie kontekstu w adresie np. example.com/sp1/lessons
Obecnie stosuje sesje, ale problemem jest swobodne poruszanie się po różnych obszarach np. trudno obsłużyć sytuację gdy mamy w dwóch kartach przeglądarki otwarte 2 różne szkoły.

1 użytkowników online, w tym zalogowanych: 0, gości: 1