Projektowanie bazy danych wykorzystując IdenittyServer

0

Hej!

Od razu zaznaczę, że projekt jest robiony trochę dla zabawy, trochę do portfolio, także zapewne użycie IdentityServera jest overkillem, ale chcę zwyczajnie zrobić coś ciekawego, szczególnie, że z samym IdentityServerem wcześniej się nie bawiłem i jest to doskonała okazja.
Moje pytania rodzą się tylko z tego, że sam zawodowo pracuję jako .net dev, ale do tej pory w pracy korzystałem tylko z nierelacyjnych baz (wiem, dosyć wyjątkowo) stąd brakuje mi takiego doświadczenia z bardziej zaawansowanymi rzeczami w budowaniu relacyjnych baz.
Chcę stworzyć aplikację, upraszczając całość, chciałbym aby trzymać userów w IdentityServerze, tak aby mieć osobną aplikację do autoryzacji, a cała reszta byłaby obsługiwana przez drugię API .net + EntityFramework.
I teraz tak, na potrzeby tego tematu załóżmy, że mamy tylko 3 encje, kolejno są to User, Company oraz Truck. User powinien mieć przypisaną firmę (choć jak tak teraz myślę, to bardziej encja Company powinna mieć przypisanego Usera, ale już mniejsza o to, problem będzie ten sam), a User z odpowiednią rolą będzie miał przypisaną ciężarówkę. Problem pojawia się przy okazji mapowania zależności w relacyjnej bazie, no bo popatrzcie, jeżeli autoryzację chcę obsłużyć przez IdentityServer, wypadałoby trzymać dane dla tej appki w osobnej bazie, niż cała reszta aplikacji. Spoko, z tym nie mam problemu, ale schody pojawiają się wtedy, kiedy próbuję rozkminić jak sensownie połączyć usera z bazy od IdentityServer z resztą bazy, bo jednak po stronie UI zarówno User'zy jak i reszta encji powinna być w założeniu możliwa do przeszukiwania z odpowiednimi filtrami, pobierania danych itd. itp. Pojawiło mi się jednak kilka pomysłów, poniżej wypiszę je wraz z plusami oraz minusami, jakie są moim zdaniem:
Mapowanie usera w tabelach bazy zawierającej pozostałe encje (np. truck):

  • zaburzenie logiki - w takim zestawieniu to ciężarówka będzie posiadać użytkownika, a nie na odwrót
  • brak tworzenia osobnych tabel (jeśli można to nazwać plusem)
  • brak mapowania zależności w bazie idenitty (co wydaje mi się być ogólnie złym pomysłem, wydaje mi się, że identittyserver nie powinno mieć dostępu do danych, które są istotne dla drugiej części aplikacji)
    Mapowanie encji Truck z Userem w bazie Identity
  • Konieczność wołania IdentityServera w przypadku przypisywania ciężarówki, czy potencjalnie odwoływania się do dwóch tabel na raz w przypadku pobrania jakichś wartości
  • Wrzucanie id'ków do encji z innej bazy danych do bazy Identity
  • Bardziej logiczne miejsce przypisania w tym wypadku Truck'a do User'a
    Stworzenie tabeli mapującej zależności z obu tabel
  • dodatkowa tabela, tylko do mapowania
  • problem przy sortowaniu / filtrowaniu danych
  • brak potrzeby wołania dwóch baz w przypadku większości operacji
    Pojawił mi się też kolejny pomysł, czyli duplikacja danych dla Usera, czyli trzymanie w tabeli User w bazie Identity wszelkich informacji potrzebnych do autentykacji użytkownika, a w tabeli User, w bazie z resztą encji kopii potrzebnych danych, do po prostu samej logiki aplikacji, jak różne relacje z innymi obiektami itd., co z pewnością rozwiązałoby sporo problemów, ale zapewne za nimi pojawiłyby się kolejne.

    Pytanie brzmi - jak to wygląda z punktu widzenia prawdziwej, realnej aplikacji biznesowej, gdzie jest osobny IdentityServer + API postawione za nim? Jak to jest logicznie podzielone, tak aby użytkownik mógł być nie tylko encją w identity do autentykacji, ale również mógł spełniać wymogi biznesowe? Strasznie mnie to ciekawi i chciałbym rozwiązać ten problem, ale chciałbym posłuchać co mają do powiedzenia osoby, co robiły kiedyś coś podobnego.
    W ostateczności wywalę pomysł używania IdentityServera, ale chciałbym jednak na nim bazować z uwagi na to, co on oferuje. Jak mówiłem dla tej aplikacji overkill, ale to jest projekt do nauczenia się m.in. tego zagadnienia, stąd tak kombinuję. 😉
    Baaardzo liczę na podpowiedź od jakiejś doświadczonej osoby w tym temacie.

0

Identity Server (provider) potrafią agregować dane z różnych źródeł (np. uwierzytelniasz się via google account, a identity server dociąga dane np. z githuba i ldapa). To co dostajesz z IdentityServera to będzie profil użytkownika i teraz masz wybór:

  • uznać, że to jest 1:1 z encją domenową User (z opisu wnioskuję, że takie podejście rozważasz)
  • uznać, że to jest coś innego niż domenowy User i zamapować UserProfile -> User (w oparciu o jakiś atrybut profilu, np. mail czy korporacyjny identyfikator z ldapa)

Uznanie podejścia "1:1" wiąże się z konsekwencjami w postaci:

  • silnego powiązania z konkretnym providerem (zmiana w przyszłości providera może nie być możliwa, albo utrudniona)
  • rozszerzenie modelu Usera może być ograniczone przez możliwości konkretnego providera (może być łatwiej/trudniej)
  • ilość danych w profilu może wpływać na wydajność
  • dane wrażliwe niekoniecznie powinny być w takim profilu widoczne

Może jak masz jakieś proste środowisko: "Identity Server, Twoja aplikacja i nic więcej", to się jakoś broni.

Osobiście nie spotkałem się z podejściem 1:1. Raczej z tym, że "UserProfile" z identity providera mapowany jest na "encję domenową user/account/customer".

0
yarel napisał(a):

Identity Server (provider) potrafią agregować dane z różnych źródeł (np. uwierzytelniasz się via google account, a identity server dociąga dane np. z githuba i ldapa). To co dostajesz z IdentityServera to będzie profil użytkownika i teraz masz wybór:

  • uznać, że to jest 1:1 z encją domenową User (z opisu wnioskuję, że takie podejście rozważasz)
  • uznać, że to jest coś innego niż domenowy User i zamapować UserProfile -> User (w oparciu o jakiś atrybut profilu, np. mail czy korporacyjny identyfikator z ldapa)

Uznanie podejścia "1:1" wiąże się z konsekwencjami w postaci:

  • silnego powiązania z konkretnym providerem (zmiana w przyszłości providera może nie być możliwa, albo utrudniona)
  • rozszerzenie modelu Usera może być ograniczone przez możliwości konkretnego providera (może być łatwiej/trudniej)
  • ilość danych w profilu może wpływać na wydajność
  • dane wrażliwe niekoniecznie powinny być w takim profilu widoczne

Może jak masz jakieś proste środowisko: "Identity Server, Twoja aplikacja i nic więcej", to się jakoś broni.

Osobiście nie spotkałem się z podejściem 1:1. Raczej z tym, że "UserProfile" z identity providera mapowany jest na "encję domenową user/account/customer".

Super, dzięki za odpowiedź, jest ona mega pomocna! Właśnie tego oczekiwałem, dzięki wielkie! 😄
Jeszcze jedno drobne pytanko mam przy okazji - w takich sytuacjach, kiedy robi się UserProfile w bazie, gdzie jest cała reszta relacji dla biznesu, to proces rejestracji użytkownika czy aktualizacji jego po prostu przepuszcza się przez endpointy w "business API", gdzie dane są odpowiednio przygotowane i dopiero lecą do IdenittyServera, a jak to się powiedzie, to dopiero zapis UserProfile do bazy? Coś ala proxy w sumie, przy czym logowanie i takie duperele wiadomo, że robi się stricte z poziomu IdentityServer, ale tam gdzie jest konieczność zapisu danych w obu bazach, to zwyczajne proxowanie poprzez businessApi do IdentityServer?
Chociaż w sumie nie wiem jak byłoby w przypadku rejestracji przez fb, gh, itd. tutaj to mogłoby być nieco trudniejsze, ale w sumie w temat się nie zagłębiałem, bo na razie robię prostą rejestracje przez maila, potem dla zabawy mogę coś takiego spróbować zrobić, tylko tak z perspektywy na razie laika nie jestem pewien, czy proxowanie z businessApi do IdentityServer zadziała.
Dzięki jeszcze raz za dotychczasową pomoc! 😀

0

@kunegundek czytam tę Twoją ostatnią wypowiedź i mam problem z jej zrozumieniem. Czy mógłbyś doprecyzować w czym problem, ale starać się przy tym unikać odniesień do implementacji?

IMO, cały problem można rozbić na kilka mniejszych:

  1. Instalacja/konfiguracja/uruchomienie Identity Servera (providera)
  2. Sprawienie, że Identity Server będzie znał "Jana Kowalskiego" (provisioning)
  3. Logowanie "Jana Kowalskiego" do aplikacjiA
  4. Rozpoznanie przez aplikacjęA, że ten kto się dobija, to użytkownik "Jan Kowalski"
  5. Sprawdzenie, że Jan Kowalski może wykonać jakąś akcję w appA / wykonanie jakiejś akcji w imieniu "Jana Kowalskiego
  6. Utworzenie w appA "konta" dla Jana Kowlaskiego

Może sporo Twoich wątpliwości rozwiązałaby lektura n.t. OAuth/ OpenID ? Pisałeś o .net, więc może to byłby dobry punkt startowy: https://learn.microsoft.com/en-us/entra/identity-platform/v2-overview ?

0
yarel napisał(a):

@kunegundek czytam tę Twoją ostatnią wypowiedź i mam problem z jej zrozumieniem. Czy mógłbyś doprecyzować w czym problem, ale starać się przy tym unikać odniesień do implementacji?

IMO, cały problem można rozbić na kilka mniejszych:

  1. Instalacja/konfiguracja/uruchomienie Identity Servera (providera)
  2. Sprawienie, że Identity Server będzie znał "Jana Kowalskiego" (provisioning)
  3. Logowanie "Jana Kowalskiego" do aplikacjiA
  4. Rozpoznanie przez aplikacjęA, że ten kto się dobija, to użytkownik "Jan Kowalski"
  5. Sprawdzenie, że Jan Kowalski może wykonać jakąś akcję w appA / wykonanie jakiejś akcji w imieniu "Jana Kowalskiego
  6. Utworzenie w appA "konta" dla Jana Kowlaskiego

Może sporo Twoich wątpliwości rozwiązałaby lektura n.t. OAuth/ OpenID ? Pisałeś o .net, więc może to byłby dobry punkt startowy: https://learn.microsoft.com/en-us/entra/identity-platform/v2-overview ?

Hej, dzieki za odpowiedź!
Dzięki za linka, na pewno doczytam, ogólnie podstawy mam, ale na pewno jest jeszcze sporo rzeczy o których nie wiem.
Po prostu największe możliwości mam co do tego, w którym momencie zrobić profil użytkownika, to znaczy, w którym momencie do bazy appki wrzucić profil Janka Kowalskiego. Wiesz, jeżeli w IdentityServerze stworzymy kotno, to mamy ładnie zbudowane konto w bazie Identity,a le jeszcze dla logiki biznesowej trzeba stworzyć profil użytkwonika i tylko tutaj pojawiły mi się niejasności, co jest najlepszym rozwiązaniem, tak aby w miarę równolegle stworzyć konto Janka w IdentityServerze jak i utworzyć profil w appce biznesowej.
Teoretycznie można to rozbić w UI jak tak myślę na dwa kroki, to znaczy krok rejestracji, a następnie drugi krok czy też po prostu drugi request, jeśli poprzedni się powiódł, do zapisu profilu użytkownika w bazie appki biznesowej? Brzmi chyba też sensownie, ale nie jestem pewien, bo zwyczajnie baaardzo mało we frontendzie robiłem, planuję nauczyć się podstaw reacta, ale to po zrobieniu backendu. 😄

1

Nie powinieneś zacząć tworzyć aplikacji od bazy danych.

Powinieneś się skupić na tym co aplikacja ma robić, jakie funkcje ma spełniać, jakie są usecase'y.

1

@kunegundek

w którym momencie do bazy appki wrzucić profil Janka Kowalskiego.

W żadnym. Po to masz IdP aby nie tworzyć tego profilu u siebie. Dodatkowe dane wiążesz po sub claimie. Jest on unikalny dla "użytkownika", pomiedzy "rodzajami" uwierzytelniania.
Natomiast dane użytkownika np do wyświetlenia ciągniesz z IdP albo z tokena. I nie możesz ich zapisywać u sb bo wtedy wiąże się to z potrzeba robienia synchronizacji co jest kompletnie bez sensu.

0

@kunegundek Skupiłbym się na dwóch różnych case'ach:

  1. Rzecz dzieje się w korporacji i wdrażasz nową apkę
  2. Rzecz dzieje się w internetach i masz swoją apkę

Ad.1) korporacje przeważnie mają istniejącą infrastrukturę, w szczególności jakieś wewnętrzne katalogi użytkowników (np. Active Directory), rozwiązania SSO. Więc tu problem tworzenia nowego użytkownika i sprawienie, że Identity Server go rozpozna schodzi na drugi plan. Po tym jak pojawia się nowy pracownik korporacji, to przechodzi proces onboardingu, dostaje laptopa, ma tworzone konta w systemach itd. Więc taki pracownik będzie w stanie się w Identity Serverze uwierzytelnić.

Ad.2) W internetach będziesz pewnie korzystał z zewnętrznych Identity Providerów (np. google, facebook, github, ... )

IMO, "tworzenie użytkownika w identity providerze", to nie Twój problem.

Twoim problemem jest integracja z identity serverem. Użytkownik wchodzi na stronę Twojej aplikacji i masz 2 opcje:
a) wiesz kto to jest
b) nie wiesz kto to jest

b) nie wiesz kto to jest -> przekierowujesz do Identity Servera -> wiesz kto to jest -> zredukowałeś problem do a)

Jak wiesz kto to jest to masz możliwość:
a) sprawdzenia czy profile delikwenta istnieje w Twojej aplikacji i odpowiedniej reakcji

  • profile istnieje -> zalogowany -> przekieruj do "landing page"
  • profil nie istnieje -> Wyświetlasz wizarda "Chcesz założyć konto? Tak / NIe" -> "Tak" -> tworzysz profil, 'Nie' -> 'zapraszamy jak się zdecydujesz'

Istotą identity providera jest to, że uzyskujesz potwierdzenie tożsamości ziomka i masz możliwość dostępu do podstawowych informacji (np. "subject name", "mail", "phone", ...) (bezpośrednio z tokena, bądź przez odpytanie identity providera).

Ty prawdopodobnie uważasz, ze należy zakładać jakieś konto w providerze. Nie idź tą drogą :-)

0
Riddle napisał(a):

Nie powinieneś zacząć tworzyć aplikacji od bazy danych.

Powinieneś się skupić na tym co aplikacja ma robić, jakie funkcje ma spełniać, jakie są usecase'y.

To znaczy, usecase'y mam gotowe, tam trochę brakowało niekiedy precyzji, która teraz się pojawiła, co było błędem przy projektownaiu usecase'ów, ale teraz mam je jak najbardziej gotowe.

Schadoow napisał(a):

@kunegundek

w którym momencie do bazy appki wrzucić profil Janka Kowalskiego.

W żadnym. Po to masz IdP aby nie tworzyć tego profilu u siebie. Dodatkowe dane wiążesz po sub claimie. Jest on unikalny dla "użytkownika", pomiedzy "rodzajami" uwierzytelniania.
Natomiast dane użytkownika np do wyświetlenia ciągniesz z IdP albo z tokena. I nie możesz ich zapisywać u sb bo wtedy wiąże się to z potrzeba robienia synchronizacji co jest kompletnie bez sensu.

No okej, aleee problem pojawia się wtedy, kiedy chcę na przykład wyświetlać listę użytkowników, przefiltrować ją itd., subclaimy o ile dobrze rozumiem mają w sumie dużo sensu - w takim wypadku na ich bazie można po prostu mieć dostęp do informacji o powiązaniach potrzebnych do logiki biznesowej, spoko, ale pozostaje problem filtrowania, sortowania użytkowników, który nie wiem czy dałoby się bez profilowania u siebie w bazie sensownie rozwiązać, no chyba że ja o czymś nie wiem? Jeśli tak, to chętnie poczytam propozycję. Chodzi mi dosłownie o coś w stylu wyświetlenia listy userów z daną rolą, możliwością jej sortowania po numerze telefonu itd., tak aby użytkownik był nie tylko tworzony na potrzeby wejścia do systemu i poklikania w nim, a żeby użytkownik również mógł być częścią logiki biznesowej, dokładnie użytkownik z jakąś customową rolą np. TruckDriver. Bez tego w późniejszym etapie brak listowania użytkowników w aplikacji może mi sprawić spory kłopot.
No chyba, że da się to również sensownie zrobić z identityserverem, nawet samemu go rozszerzając i że jest to jak najbardziej oki, to w takim wypadku proszę o choć drobną wskazówkę.

yarel napisał(a):

@kunegundek Skupiłbym się na dwóch różnych case'ach:

  1. Rzecz dzieje się w korporacji i wdrażasz nową apkę
  2. Rzecz dzieje się w internetach i masz swoją apkę

Ad.1) korporacje przeważnie mają istniejącą infrastrukturę, w szczególności jakieś wewnętrzne katalogi użytkowników (np. Active Directory), rozwiązania SSO. Więc tu problem tworzenia nowego użytkownika i sprawienie, że Identity Server go rozpozna schodzi na drugi plan. Po tym jak pojawia się nowy pracownik korporacji, to przechodzi proces onboardingu, dostaje laptopa, ma tworzone konta w systemach itd. Więc taki pracownik będzie w stanie się w Identity Serverze uwierzytelnić.

Ad.2) W internetach będziesz pewnie korzystał z zewnętrznych Identity Providerów (np. google, facebook, github, ... )

IMO, "tworzenie użytkownika w identity providerze", to nie Twój problem.

Twoim problemem jest integracja z identity serverem. Użytkownik wchodzi na stronę Twojej aplikacji i masz 2 opcje:
a) wiesz kto to jest
b) nie wiesz kto to jest

b) nie wiesz kto to jest -> przekierowujesz do Identity Servera -> wiesz kto to jest -> zredukowałeś problem do a)

Jak wiesz kto to jest to masz możliwość:
a) sprawdzenia czy profile delikwenta istnieje w Twojej aplikacji i odpowiedniej reakcji

  • profile istnieje -> zalogowany -> przekieruj do "landing page"
  • profil nie istnieje -> Wyświetlasz wizarda "Chcesz założyć konto? Tak / NIe" -> "Tak" -> tworzysz profil, 'Nie' -> 'zapraszamy jak się zdecydujesz'

Istotą identity providera jest to, że uzyskujesz potwierdzenie tożsamości ziomka i masz możliwość dostępu do podstawowych informacji (np. "subject name", "mail", "phone", ...) (bezpośrednio z tokena, bądź przez odpytanie identity providera).

Ty prawdopodobnie uważasz, ze należy zakładać jakieś konto w providerze. Nie idź tą drogą :-)

O, chyba zaczynam rozumieć i ma to sens. 😄 Czyli coś w stylu zakładania konta w IdentityServerze i potem po zalogowaniu do aplikacji sprawdzenie czy jest stworzony profil i jak nie, to prośba o jego utworzenie, spoko! Ma to sens, zaczyna to wszystko iść w dobrą stronę, podoba mi się. 😉

I ogólnie sorkii, jeśli jakieś pytania wydają się głupie, czy błache, ale akurat w ten konkretny temat wchodzę pierwszy raz, a że nie chcę zrobić jakiegoś dziadostwa niczym janusz programista, to napisałem post na forum, co by od razu zacząć to robić z dobrymi praktykami, co da mi sporo nowego doświadczenia i nauki. 😉 Jak na razie jestem z naszej dyskusji mega zadowolony, bo zaczyna mi się to rozjaśniać i doskonale, bo uwierzcie, że wchodząc tak na prawdę w temat uwierzytelniania przez IdentityServer i budowania obok serwisu z logiką biznesową, pojawia się wiele pytań i wątpliwości co do rozwiązań, które przychodzą do głowy, kiedy się z tym nie ma doświadczenia żadnego, a w robocie serwis nad którym się pracuje nawet w 10% nie przypomina tego, co aktualnie robię po godzinach... 😄

0

@kunegundek

No okej, aleee problem pojawia się wtedy, kiedy chcę na przykład wyświetlać listę użytkowników,

Robisz calla dla IdP po tych użytkowników i wyświetlasz.

Wyobraź sobie scenriusz masz użytkownika z AD jakiejś firmy i ktoś zmienia nazwisko. To wtedy w twoim systemie zawsze będą stare dane. Ideą SSO i zewnetrznych IdP jest zeby te informacje były w jednym miejscu i zawsze aktualne.

0
kunegundek napisał(a):

To znaczy, usecase'y mam gotowe, tam trochę brakowało niekiedy precyzji, która teraz się pojawiła, co było błędem przy projektownaiu usecase'ów, ale teraz mam je jak najbardziej gotowe.

No to teraz najlepszym krokiem byłoby je zaimplementować w aplikacji, ale nie koniecznie razem z bazą. Napisz testy pod te use-case'y, dane początkowo możesz trzymać w RAMie. Bazę bym zostawił na później.

0
Schadoow napisał(a):

@kunegundek

No okej, aleee problem pojawia się wtedy, kiedy chcę na przykład wyświetlać listę użytkowników,

Robisz calla dla IdP po tych użytkowników i wyświetlasz.

Wyobraź sobie scenriusz masz użytkownika z AD jakiejś firmy i ktoś zmienia nazwisko. To wtedy w twoim systemie zawsze będą stare dane. Ideą SSO i zewnetrznych IdP jest zeby te informacje były w jednym miejscu i zawsze aktualne.

Oki, a problemem nie jest trzymanie dajmy na to id ciężarówki, do której jest przypięty dany kierowca, w bazie IdentityServer? Wiem, że można śmiało po prostu samemu rozszerzyć IdentityServer i to doimplementować, ale bardziej chodzi mi z punktu widzenia jakby separacji szczegółów biznesowych od IdentityServera, no chociaż z drugiej strony w końcu gdzieś te dane trzeba trzymać, więc to chyba nie jest tak naprawdę problem, a jak zrobimy to Twoją sugestią w bazie IdentityServera, to tylko minimalnie przemycimy drobne informacje przydające się do logiki na rzecz tego, żeby móc je umieścić w claimach i móc potem bez problemu i po takiej autoryzacji wykonywać różne akcje na aplikacji biznesowej, ma to sens. 😉

Riddle napisał(a):
kunegundek napisał(a):

To znaczy, usecase'y mam gotowe, tam trochę brakowało niekiedy precyzji, która teraz się pojawiła, co było błędem przy projektownaiu usecase'ów, ale teraz mam je jak najbardziej gotowe.

No to teraz najlepszym krokiem byłoby je zaimplementować w aplikacji, ale nie koniecznie razem z bazą. Napisz testy pod te use-case'y, dane początkowo możesz trzymać w RAMie. Bazę bym zostawił na później.

Dobra, uwaga, dzięki! 😀 Zawsze to łatwiejsze niż co chwilę modyfikowanie bazy, bo nagle się okazuje, że coś co zrobiłem jednak przy tworzeniu use case'ów jest niewystarczające, w sumie dokładnie taki problem mnie napotkał, że wszystko spoko, dopóki nie zacząłem implementacji i nagle się okazuje, że zamiast robić dalszą implementację, to ja siedzę i przerabiam bazę, bo mi nie pasuje...
Dzięki wielkie Panowie, jesteście wielcy, każdy po kolei! 😀

0
Riddle napisał(a):
kunegundek napisał(a):

To znaczy, usecase'y mam gotowe, tam trochę brakowało niekiedy precyzji, która teraz się pojawiła, co było błędem przy projektownaiu usecase'ów, ale teraz mam je jak najbardziej gotowe.

No to teraz najlepszym krokiem byłoby je zaimplementować w aplikacji, ale nie koniecznie razem z bazą. Napisz testy pod te use-case'y, dane początkowo możesz trzymać w RAMie. Bazę bym zostawił na później.

Dobra, uwaga, dzięki! 😀 Zawsze to łatwiejsze niż co chwilę modyfikowanie bazy, bo nagle się okazuje, że coś co zrobiłem jednak przy tworzeniu use case'ów jest niewystarczające, w sumie dokładnie taki problem mnie napotkał, że wszystko spoko, dopóki nie zacząłem implementacji i nagle się okazuje, że zamiast robić dalszą implementację, to ja siedzę i przerabiam bazę, bo mi nie pasuje...
Dzięki wielkie Panowie, jesteście wielcy, każdy po kolei! 😀

Tylko wiesz że ja mówiąc "use-case" nie miałem na myśli jakiegoś spisanego wymyślonego requirementu na kartce, tylko faktyczną funkcjonalność w programie, nie?

Jeśli użytkownik ma np. dodać jakiś post, dać lajka, wysłać coś, usunąć coś - to wszystko da się zaimplementować razem z całą logiką bez bazy.

0
Riddle napisał(a):
Riddle napisał(a):
kunegundek napisał(a):

To znaczy, usecase'y mam gotowe, tam trochę brakowało niekiedy precyzji, która teraz się pojawiła, co było błędem przy projektownaiu usecase'ów, ale teraz mam je jak najbardziej gotowe.

No to teraz najlepszym krokiem byłoby je zaimplementować w aplikacji, ale nie koniecznie razem z bazą. Napisz testy pod te use-case'y, dane początkowo możesz trzymać w RAMie. Bazę bym zostawił na później.

Dobra, uwaga, dzięki! 😀 Zawsze to łatwiejsze niż co chwilę modyfikowanie bazy, bo nagle się okazuje, że coś co zrobiłem jednak przy tworzeniu use case'ów jest niewystarczające, w sumie dokładnie taki problem mnie napotkał, że wszystko spoko, dopóki nie zacząłem implementacji i nagle się okazuje, że zamiast robić dalszą implementację, to ja siedzę i przerabiam bazę, bo mi nie pasuje...
Dzięki wielkie Panowie, jesteście wielcy, każdy po kolei! 😀

Tylko wiesz że ja mówiąc "use-case" nie miałem na myśli jakiegoś spisanego wymyślonego requirementu na kartce, tylko faktyczną funkcjonalność w programie, nie?

Jeśli użytkownik ma np. dodać jakiś post, dać lajka, wysłać coś, usunąć coś - to wszystko da się zaimplementować razem z całą logiką bez bazy.

Tzn. tak, teraz Cię doskonale rozumiem. Ogólnie z punktu widzenia nawet tego jak w pracy nowe serwisy stawiamy, to się zabrałem od d**y strony, jak mi to pokazałeś z tej perspektywy, to trochę mnie to dziwi w sumie, bo np. w pracy jest tak, że dostajemy do zrobienia jakiś zupełnie nowy ficzer, stawiamy microservice, na początku bez żadnych zewnętrznych zależności, happy path z zahardcodowanymi rzeczami i logiką, a od tego jak już pod to są jakieś podstawowe testy itd., to zaczynamy dodawać czy to bazę danych w przypadku produktów w pracy nierelacyjną, czy jakąś kolejkę itd. Ma to dużo sensu, bo mając napisane use case'y w takiej formie o jakiej mówisz, a nie "na kartce", po prostu dużo sprawniej i łatwiej da się zauważyć po prostu co realnie będziemy potrzebować. Spoko! Jestem mega zadowolony z uzyskanej tutaj pomocy i nawet nie wiecie jak serio dużo się dowiedziałem i zrozumiałem, zarówno jak chodzi o podejście do pewnych spraw w appcje, jak i zwyczajnie zrozumiałem też błędy popełniane w trakcie tworzenia. 😀

0
kunegundek napisał(a):

Tzn. tak, teraz Cię doskonale rozumiem. Ogólnie z punktu widzenia nawet tego jak w pracy nowe serwisy stawiamy, to się zabrałem od d**y strony, jak mi to pokazałeś z tej perspektywy, to trochę mnie to dziwi w sumie, bo np. w pracy jest tak, że dostajemy do zrobienia jakiś zupełnie nowy ficzer, stawiamy microservice , na początku bez żadnych zewnętrznych zależności, happy path z zahardcodowanymi rzeczami i logiką, a od tego jak już pod to są jakieś podstawowe testy itd., to zaczynamy dodawać czy to bazę danych w przypadku produktów w pracy nierelacyjną, czy jakąś kolejkę itd.

Jezus maria.

Gdybym chciał komuś zrobić krzywdę i chciałbym żeby wytworzył najgorszy do utrzymania software z możliwych, to wtedy poleciłbym mu taki styl pracy.

Jeśli zaczynasz od postawienia mikroserwisu zanim zaczniesz pracę, to właśnie postawiłeś sobie kłodę pod nogę która sprawi że wolniej będziesz mógł wprowadzić zmiany w swoim designie.

To co powinieneś zrobić to jest:

  1. Najpierw zidentyfikować use-case'y- co użytkownik może faktycznie zrobić z Twoją aplikacją
  2. Potem to zaimplementować najważniejszy z nich razem z testami, ale tak żeby zależności było mało (nie zaczynając od bazy i UI), ale dodając je polimorficznie, tak żeby logika use'caseu o nich nie wiedziała. Stwórz go tak żeby był modularny, ale w ramach jednego procesu, bo to sprawi że stworzenie go będzie najszybsze.
  3. Pokazać użytkownikom żeby trochę tego poużywali, możesz nawet jednemu, albo PO
  4. Zebrać od niego feedback, spróbować zauważyć wady swojego designu
  5. Zrobić prosty refaktor
  6. dodać kolejny feature do use'casea, drugi najważniejszy. Powtwórzyć kroki 2-5
  7. Przez pierwszych kilka iteracji zauważysz żę najpewniej design będzie się zmieniał, żeby się dopasować do kolejnych funkcjonalności. Twój pierwszy guess designu prawie nigdy się nie okazuje poprawny, więc będzie się zmieniał.
  8. W momencie w którym uznasz że dopisywanie kolejnych use'caseów nie wymaga zmiany designu to sygnał że Twoje interfejsy i moduły są już stabilne, i nie będą się raczej zmieniać.
  9. Jeśli aplikacja jest dobra taka jest, to ją zostaw.
  10. Jeśli masz problem ze skalowalnością albo chciałbyś żeby kilka zespołów nad nimi pracowało, i potrzebujesz niezależnych deploy'ów, to wtedy możesz to rozbić na osobne procesy (np. na mikroserwisy)
  11. Ale jeśli tylko Ty i kilka innych osób nad tym pracujecie, to nie ma sensu i lepiej to zostawić w jednym procesie.

Większość programistów spaliła się w przeszłości na niemodularnych systemach, i dlatego wydaje im się że jak rozdzielą program na wiele procesów, to się przed tym uchronią.
ALE NEWS FLASH! Jesli programista ma słabe skille designowe, tak że trudno mu zaprojektować moduły w ramach jednego procesu, to tym bardziej mu się nie uda zaprojektować dobrego designu systemu rozproszonego na kilka procesów i zrobi jeszcze większy śmietnik.

1
Riddle napisał(a):
kunegundek napisał(a):

Tzn. tak, teraz Cię doskonale rozumiem. Ogólnie z punktu widzenia nawet tego jak w pracy nowe serwisy stawiamy, to się zabrałem od d**y strony, jak mi to pokazałeś z tej perspektywy, to trochę mnie to dziwi w sumie, bo np. w pracy jest tak, że dostajemy do zrobienia jakiś zupełnie nowy ficzer, stawiamy microservice , na początku bez żadnych zewnętrznych zależności, happy path z zahardcodowanymi rzeczami i logiką, a od tego jak już pod to są jakieś podstawowe testy itd., to zaczynamy dodawać czy to bazę danych w przypadku produktów w pracy nierelacyjną, czy jakąś kolejkę itd.

Jezus maria.

Gdybym chciał komuś zrobić krzywdę i chciałbym żeby wytworzył najgorszy do utrzymania software z możliwych, to wtedy poleciłbym mu taki styl pracy.

Jeśli zaczynasz od postawienia mikroserwisu zanim zaczniesz pracę, to właśnie postawiłeś sobie kłodę pod nogę która sprawi że wolniej będziesz mógł wprowadzić zmiany w swoim designie.

To co powinieneś zrobić to jest:

  1. Najpierw zidentyfikować use-case'y- co użytkownik może faktycznie zrobić z Twoją aplikacją
  2. Potem to zaimplementować najważniejszy z nich razem z testami, ale tak żeby zależności było mało (nie zaczynając od bazy i UI), ale dodając je polimorficznie, tak żeby logika use'caseu o nich nie wiedziała. Stwórz go tak żeby był modularny, ale w ramach jednego procesu, bo to sprawi że stworzenie go będzie najszybsze.
  3. Pokazać użytkownikom żeby trochę tego poużywali, możesz nawet jednemu, albo PO
  4. Zebrać od niego feedback, spróbować zauważyć wady swojego designu
  5. Zrobić prosty refaktor
  6. dodać kolejny feature do use'casea, drugi najważniejszy. Powtwórzyć kroki 2-5
  7. Przez pierwszych kilka iteracji zauważysz żę najpewniej design będzie się zmieniał, żeby się dopasować do kolejnych funkcjonalności. Twój pierwszy guess designu prawie nigdy się nie okazuje poprawny, więc będzie się zmieniał.
  8. W momencie w którym uznasz że dopisywanie kolejnych use'caseów nie wymaga zmiany designu to sygnał że Twoje interfejsy i moduły są już stabilne, i nie będą się raczej zmieniać.
  9. Jeśli aplikacja jest dobra taka jest, to ją zostaw.
  10. Jeśli masz problem ze skalowalnością albo chciałbyś żeby kilka zespołów nad nimi pracowało, i potrzebujesz niezależnych deploy'ów, to wtedy możesz to rozbić na osobne procesy (np. na mikroserwisy)
  11. Ale jeśli tylko Ty i kilka innych osób nad tym pracujecie, to nie ma sensu i lepiej to zostawić w jednym procesie.

Większość programistów spaliła się w przeszłości na niemodularnych systemach, i dlatego wydaje im się że jak rozdzielą program na wiele procesów, to się przed tym uchronią.
ALE NEWS FLASH! Jesli programista ma słabe skille designowe, tak że trudno mu zaprojektować moduły w ramach jednego procesu, to tym bardziej mu się nie uda zaprojektować dobrego designu systemu rozproszonego na kilka procesów i zrobi jeszcze większy śmietnik.

Hmm... Trochę (znowu) za bardzo uprościłem co miałem na myśli idąc w totalnie złą stronę, ale nie ma sensu teraz z tego się tłumaczyć. Tak czy siak dzięki za odpowiedź, brzmi to dobrze, a moje skille designowe i tak aktualnie na razie są na dennym poziomie i to coś, co jest u mnie na pewno do rozwoju, ale z resztą, ja i tak mam na razie względnie mało doświadczenia, szczególnie tego komercyjnego, dlatego nawet jeśli Twoja odpowiedź była napisana z poirytowaniem, to ja z niej wyciągnę tyle ile się da.

0

@kunegundek

Oki, a problemem nie jest trzymanie dajmy na to id ciężarówki, do której jest przypięty dany kierowca, w bazie IdentityServer?

Ale ty nie trzymasz id ciezarowki w IdP. Tylko id z idp wiążesz w module ktory te informacje potrzebuje przetworzyc. IdP ma nie mieć wiedzy o domenie twojej aplikacji ani aplikacja o zarządzaniu tożsamością.

BTW żeby ktoś sie zaraz nie przyczepił. Mówiąc nie trzymasz id cieżarówki w idp miałem na myśli wiazania w kontekście procesu biznesowego. W ramach procesów autoryzacyjnych w szczególności ABAC czy PBAC moduł PDP potrzebuje ew do ewaluacji tych informacji. (Przykład w AWS jak piszesz politykę to musisz podać identyfikator lub funkcje identyfikującą zasób w ramach konkretnych zasobów/serwisów)

0
Schadoow napisał(a):

@kunegundek

Oki, a problemem nie jest trzymanie dajmy na to id ciężarówki, do której jest przypięty dany kierowca, w bazie IdentityServer?

Ale ty nie trzymasz id ciezarowki w IdP. Tylko id z idp wiążesz w module ktory te informacje potrzebuje przetworzyc. IdP ma nie mieć wiedzy o domenie twojej aplikacji ani aplikacja o zarządzaniu tożsamością.

Okej, jasne, to się pokrywa z moimi założeniami jakie miałem na początku, tzn. nie mieszanie tych rzeczy. W takim wypadku po prostu i tak trzeba gdzieś te informacje przechować, przynajmniej na ten moment sobie tak to wyobrażam. W takim wypadku, można to związać mapując to za pomocą po prostu tabeli, która będzie przechowywać dla danego id użytkownika (bez reszty informacji, samo id), id różnych powiązań, czyli np ciężarówka? Czy jakoś inaczej byś to widział? Sorki, jeśli pytanie wydaje się głupie, ale próbuję jak najlepiej zrozumieć co masz na myśli 😀

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