Cześć,
Chciałbym w niedalekiej przyszłości napisać aplikację w asp.net core z użyciem EF wspomagającą firmy w podstawowym zakresie księgowo-kadrowym.
Być może opis koncepcji nie jest istotny, ale idea jest mniej więcej taka, że mamy kilka grup użytkowników typu: Administrator, Właściciel, Manager, Pracownik itp.
W bazie będzie wiele firm, każda firma będzie miała opcję tworzenia wielu lokali, a te będą mogły być dzielone jeszcze bardziej szczegółowo. Do każdego lokalu lub "podlokalu" będzie można "przypiąć" użytkownika z odpowiednią rolą (np. Managera). Dodatkowo użytkownik może mieć uprawnienia np. Managera w dwóch lub większej liczbie lokali.
Jeśli użytkownik został przypisany jako Manager do lokalu A i B to tylko do tych lokali może mieć dostęp w odpowiednim zakresie. Dodatkowo jeśli lokal został podzielony na mniejsze części to Manager powinien mieć dostęp również do tych niższych poziomów.
Tak więc struktura np. lokalu będzie na zasadzie Id, ParentId - a wydobywanie informacji z takiej struktury jest dość kosztowne (i/lub mało czytelne).

Reasumując: za każdym razem, gdy człowiek wchodzi na jakąś podstronę muszę wiedzieć czy:

  • ma do niej uprawnienia
  • do jakich danych ma dostęp na danej stronie
  • być może coś jeszcze(?).
    Wydobywanie tych informacji za każdym razem z bazy danych chyba jest złym pomysłem, chociaż zdaje się, że EF korzysta z cacheowania (nie wiem tylko czy zawsze).

Obecnie zastanawiam się jak to najlepiej zorganizować w aplikacji. Dopiero uczę się tych wszystkich mechanizmów i nie wiem w którym miejscu, jaki mechanizm powinienem wykorzystać. Dlatego bardzo proszę was o komentarz do niżej wymienionych koncepcji.

1a. Na początku przyszła mi do głowy sesja. Idea była prosta: jeśli sesja == null to należy załadować dane z bazy o uprawnieniach użytkownika else zwrócić to co siedzi w sesji (informacje o strukturze do której użytkownik ma dostęp).
1b. Analogicznie jak wyżej myślałem o ciasteczkach.
W obu przypadkach mam jednak mieszane uczucie. Podstawowa koncepcja obu mechanizmów jest mi znana, jednak to tylko podstawowa wiedza. Zacząłem się m.in. zastanawiać co w przypadku, gdy Administrator odbierze użytkownikowi uprawnienia - wówczas do utraty sesji użytkownik będzie korzystał z dawnych uprawnień... Dodatkowo wiele złego mówi się o Sesjach.

  1. Wykorzystanie obok SQL bazy typu NoSQL do przechowywania informacji o użytkownikach. Wcześniej temat NoSQL mnie średnio interesował, jednak w przypadku przechowywania informacji o strukturze lokali w formie drzewa NoSQL wydaje się dobrym rozwiązaniem (brak konieczności przechodzenia przez wszystkie wiersze w celu szukania potomków itd. - ładujemy od razu całe drzewo z informacjami). Z drugiej strony może to trochę skomplikować projekt. Dodatkowo nie znam jeszcze żadnej bazy typu NoSQL. Wydaje mi się jednak, że niezależnie od NoSQL musiałbym dublować informację o strukturze lokali etc. w bazie SQL. NoSQL służyłaby jedynie do szybkiego wydobywania informacji o użytkowniku, natomiast aktualizacja struktury odbywałaby się w SQL oraz NoSQL.

  2. Najprostszym (przynajmniej tak mi się wydaje) rozwiązaniem byłoby przechowywanie danych w pamięci aplikacji. Wiem, że zmiennych statycznych w aplikacji webowych nie powinno się stosować. Natomiast można do tego użyć services.AddSingleton. Do tej pory z tego nie korzystałem, ale tak wstępnie wydaje się to dość wygodny mechanizm do przechowywania pewnych informacji w pamięci i stosunkowo łatwe ich wydobycie. Idea byłaby taka, że byłby jakiś słownik z kluczem powiązanym z użytkownikiem i ze strukturą do której ma ten użytkownik dostęp. W przypadku dodania nowej firmy do bazy lub nowego użytkownika słownik byłby aktualizowany razem ze strukturą. Analogicznie np. w przypadku odebrania uprawnień użytkownikowi. Zastanawiam się tylko co w przypadku pracy wielowątkowej - zakładam, że wówczas trzeba byłoby się zabezpieczyć przed możliwością aktualizacji struktury przez dwóch użytkowników jednocześnie.

Jak znacie jakieś inne rozwiązania to dajcie proszę znać. Bardziej zależy mi jednak na skomentowaniu tego co sam napisałem.
Będę wdzięczny za wasze komentarze w powyższym temacie.