System logowania z podzałem na role

System logowania z podzałem na role
P1
  • Rejestracja:około 7 lat
  • Ostatnio:około 2 miesiące
  • Postów:179
2

Witam serdecznie wszystkich.

Chciał bym się poradzić o poradę ludzi którzy mają jakieś doświadczenie w tego typie projektów. Załóżmy że tworzę aplikację do której się loguje i jest podział na role typu Admin , user itp. Oczywiście Admin ma więcej funkcji niż taki user. Żeby zrobić taki podział to używać takich konstrukcji jak:

Kopiuj
//Szukanie użytkownika w bazie danych i pobranie jego danych do zmiennych
if(role=="Admin")
{
 //Wyświetlenie panelu dla Admina
}
else if(role=="User")
{
 //Wyświetlanie panelu dla User
}

I robić dwa oddzielnie panele z danymi funkcjami dla Usera i Admina ?

Pytanie jest tylko teoretyczne i dla rozwiania moich wątpliwości w tej kwestii.

Dziękuję z góry za wszelkie odpowiedzi.

cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:około 20 godzin
  • Lokalizacja:Poznań
  • Postów:8769
0

A czy funkcje admina i użytkownika będą totalnie inne, czy czescuowo się pokrywać?

Poza tym raczej bym poszedł w stronę napisania jednego mechanizmu obsługi panelu i jedynie bym do niego wstrzykiwał różna zawartość.

Dales za mało konkretów żeby jakiś sensownie odpowiedzieć, więc rady są bardzo ogólne.


P1
  • Rejestracja:około 7 lat
  • Ostatnio:około 2 miesiące
  • Postów:179
0

Załóżmy że funkcje admina i użytkownika będą się pokrywać ale też ciekawi mnie jak by wyglądała wersja gdyby były całkiem inne.

Czyli stworzyć jeden panel i potem na podstawie if wyświetlać odpowiednie funkcje dla danej roli ?

piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 16 godzin
  • Postów:3277
3

Tak teoretycznie, to nie da się odpowiedzieć na podstawie danych, które podałeś. Szczególnie w tym dziale będzie to trudne, bo zakładam, że chodzi o jakąś aplikację desktopową.
Zakładając, że faktycznie chcesz mieć autoryzację opartą na rolach (google RBAC), to trzeba sobie jeszcze odpowiedzieć na takie pytania ile tych ról będzie, czy bądą one jedynie wbudowane w aplikację, czy administrator będzie mógł tworzyć własne.
Tak czy inaczej, to czy użytkownikowi wyświetlić ten panel, czy inny jest drobnym szczegółem, który już zakłada błąd. To jedynie UI. Załóżmy, że robisz sobie menu, które wyświetla się tylko administratorowi i masz tam pozycję "wyczyść bazę danych". Chwilę później, ktoś stwierdza, że ten przycisk powinien być też dosępny w innym miejscu, doda go na jakiejś formatce, zapomni dodać warunki autoryzacji i wziu...

Czyli pierwsze zastrzeżenie - niezależnie od tego co i jak pokażesz użytkownikowi, samo sprawdzenie uprawnień powinno następować w funkcji odpowiedzialnej za wykonanie jakiejś tam czynności.
To oznacza, że logika tej funkcji nie powinna byc w tym samym kawałku kodu, co rysowanie UI.

Natomiast ze względów czysto estetycznych / UX faktycznie nie warto wyświetlać użytkownikowi pozycji dla niego niedostępnych i tutaj to już jak kto chce i jak wygodniej. Najprościej zrobić gdzieś tam dodatkowy panel, który zawiera te krytyczne funkcje aplikacji i jest widziany jedynie przez administratora.

P1
Rozumiem. Czyli Załóżmy kod odpowiedzlany za generowanie panelu admina I funkcji powinny być nie zależne ?
cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:około 20 godzin
  • Lokalizacja:Poznań
  • Postów:8769
2

Załóżmy że funkcje admina i użytkownika będą się pokrywać ale też ciekawi mnie jak by wyglądała wersja gdyby były całkiem inne.
Czyli stworzyć jeden panel i potem na podstawie if wyświetlać odpowiednie funkcje dla danej roli ?

Ogólnie to i tak bym podszedł do tego w ten sposób, żeby nie kodować tego na pałę, tylko stworzyć jakiś mechanizm/silnik do wyświetlania i obsługi panelu, a potem do niego przekazywać, jakie elementy mają być wyświetlone oraz co ma się dziać po ich wybraniu.

A już mając to można wybrać wariant: czy stworzyć 2 osobne panele (bazujące na tym samym szablonie) czy jeden, w którym warunkowo będą pokazywane lub ukrywane poszczególne elementy.

Ale nie jestem w stanie doradzić nic więcej mając tyle informacji, ile przekazałeś. To jest bardzo ogólne pytanie i tak samo ogólna odpowiedź.


loza_prowizoryczna
  • Rejestracja:ponad 2 lata
  • Ostatnio:2 dni
  • Postów:1606
0
pestka12 napisał(a):

I robić dwa oddzielnie panele z danymi funkcjami dla Usera i Admina ?

Użycie switcha w takiej konstrukcji rozwiąże większość twoich problemów - o ile będziesz ostrożny i wiedział gdzie należy postawić break.


Przetrzyma wszystko
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około godziny
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0

Cześć @pestka12!

Kiedy mówisz "użytkownik" i "administrator", masz na myśli użytkownika i administratora Twojej aplikacji? Czy chodzi o systemowego administratora komputera na którym uruchomiona jest aplikacja? 🤔

P1
Aplikacji czyli mamy korporację i jedna aplikacja działa zależnie od zalogowanego użytkownika
M0
  • Rejestracja:ponad 11 lat
  • Ostatnio:2 minuty
  • Postów:363
2

Pomijając już jak role się nazywają. Mechanizm z systemem uprawnień. Dana rola(a może użytkownik?) ma dane uprawnienia. Na "frontach" za pomocą mechanizmu określam co mogę mu wyświetlić. User posiada dane uprawnienie, wyświetl mu przycisk, pozwól na coś. Pisanie na pałę if (coś tam) jest podejściem szybkim, które w przyszłości się zemści.
Przykład. Masz dodać nową rolę, która będzie widziała część elementów Admina. Musisz przejrzeć całą apkę i modyfikować ify, zamiast stworzyć odpowiednią rolę i podpiąć jej odpowiednie uprawnienia. Na frontach nic się nie zmienia, a masz nową rolę w systemie. Ba, w przyszłosci to możesz rozbudować na dynamiczne zarządzanie uprawnieniami per user, a dzięki systemowi uprawnień, nie będziesz musiał modyfikować frontów. To jest koncepcja, która działa bez względu na język(pewnie są jakieś skrajne przypadki jak asm(chyba))

Co do tego czy mają mieć wspólne "fronty" czy osobne apki. To zależy. Zależy od kontekstu i rozbudowania(zabezpieczeń). U mnie w projektach użytkownicy(są to randomowi ludzie z ulicy, którzy korzystają z apki). Mają własne fronty i tam już mamy podział na role). Zaś "admin" ma swoje fronty i tam znów mamy różne typy kont, w zależności co dany user może zrobić, a czego nie.

P1
  • Rejestracja:około 7 lat
  • Ostatnio:około 2 miesiące
  • Postów:179
0
cerrato napisał(a):

Załóżmy że funkcje admina i użytkownika będą się pokrywać ale też ciekawi mnie jak by wyglądała wersja gdyby były całkiem inne.
Czyli stworzyć jeden panel i potem na podstawie if wyświetlać odpowiednie funkcje dla danej roli ?

Ogólnie to i tak bym podszedł do tego w ten sposób, żeby nie kodować tego na pałę, tylko stworzyć jakiś mechanizm/silnik do wyświetlania i obsługi panelu, a potem do niego przekazywać, jakie elementy mają być wyświetlone oraz co ma się dziać po ich wybraniu.

A już mając to można wybrać wariant: czy stworzyć 2 osobne panele (bazujące na tym samym szablonie) czy jeden, w którym warunkowo będą pokazywane lub ukrywane poszczególne elementy.

Ale nie jestem w stanie doradzić nic więcej mając tyle informacji, ile przekazałeś. To jest bardzo ogólne pytanie i tak samo ogólna odpowiedź.

Oczywiście ja tylko uwzględniam jakiś mechanizm / silnik który ułatwi pracę a nie pisać głupią logikę typu jeśli rola jest równa admin to generuj te kontrolki. Myślałem żeby wykorzystać tu dziedziczenie czyli mam klasę User a potem po niej dziedziczy Admin bo w końcu Admin to również użytkownik tylko z większymi prawami.

Pytanie się w ogóle zrodziło się z tego bo ostatnio tworzyłem projekt i wymagali go w C# i tam takie rzeczy jak podział na role itp było praktycznie gotowymi szablonami. A że głównie siedzę w C++ to jestem ciekaw jak tu wykonywać takie zadania na chociaż w miarę okej poziomie.

edytowany 2x, ostatnio: pestka12
Miang
  • Rejestracja:prawie 7 lat
  • Ostatnio:3 minuty
  • Postów:1659
0
pestka12 napisał(a):
cerrato napisał(a):

dzić nic więcej mając tyle informacji, ile przekazałeś. To jest bardzo ogólne pytanie i tak samo ogólna odpowiedź.

Oczywiście ja tylko uwzględniam jakiś mechanizm / silnik który ułatwi pracę a nie pisać głupią logikę typu jeśli rola jest równa admin to generuj te kontrolki. Myślałem żeby wykorzystać tu dziedziczenie czyli mam klasę User a potem po niej dziedziczy Admin bo w końcu Admin to również użytkownik tylko z większymi prawami.

dziedziczenie ale nie takie
Panel
PanelUser : public Panel
PanelAdmin : public Panel


dzisiaj programiści uwielbiają przepisywać kod z jednego języka do drugiego, tylko po to by z projektem nadal stać w miejscu ale na nowej technologii
P1
  • Rejestracja:około 7 lat
  • Ostatnio:około 2 miesiące
  • Postów:179
0

Mi chodziło o coś takiego w kwestii dziedziczenia. Przykład napisany w C++ WxWidget:

Kopiuj
class AdminPanel : public wxFrame {
public:
    AdminPanel() : wxFrame(nullptr, wxID_ANY, "Admin Panel") {
        wxPanel* panel = new wxPanel(this);
        wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);

        sizer->Add(new wxStaticText(panel, wxID_ANY, "Welcome to Admin Panel"), 0, wxALL | wxCENTER, 10);
        panel->SetSizer(sizer);
    }
};

class UserPanel : public wxFrame {
public:
    UserPanel() : wxFrame(nullptr, wxID_ANY, "User  Panel") {
        wxPanel* panel = new wxPanel(this);
        wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);

        sizer->Add(new wxStaticText(panel, wxID_ANY, "Welcome to User Panel"), 0, wxALL | wxCENTER, 10);
        panel->SetSizer(sizer);
    }
};

I potem na podstawie danych z bazy wybieram odpowiednią ramkę która ma się wyświetlić. Czy idę myślą w dobrą stronę czy są jakieś lepsze sposoby na stworzenie tego systemu ?

P1
  • Rejestracja:około 7 lat
  • Ostatnio:około 2 miesiące
  • Postów:179
0

Witam serdecznie wszystkich.

W ostatnim tygodniu długo szukałem ciekawego rozwiązania problemu, lecz ostatnio czytałem książkę o Wzorcach projektowych w C++ i do mojego problemu pasują nie które wzorce takie jak:

  1. Fabryka
  2. Strategia
  3. Odwiedzający

Myślicie że jest to dobra droga , a jak tak to który według was wzorzec będzie najlepszy. Zaimplementowałem Wzorzec strategia do takiego systemu logowania i wygląda według mnie w porządku.

Miang
  • Rejestracja:prawie 7 lat
  • Ostatnio:3 minuty
  • Postów:1659
2

NIE, nie szukaj na siłę wzorców tylko pomyśl samemu jak zrobić


dzisiaj programiści uwielbiają przepisywać kod z jednego języka do drugiego, tylko po to by z projektem nadal stać w miejscu ale na nowej technologii
P1
Rozumiem. Myślę i jakieś pomysły są ale z tego co kojarzę to były one odradzane w poprzednich odpowiedziach.
cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:około 20 godzin
  • Lokalizacja:Poznań
  • Postów:8769
2

Skoro na siłę starasz się dopasować któryś ze wzorców, o których gdzieś przeczytałeś, znaczy że wcale te wzorce nie są tutaj potrzebne. Ja wiem, że na początku, jak poznajesz cos nowego, to starasz się wszędzie korzystać z tej nowości, to jest normalne i chyba każdy przez to przechodził. Ale posłuchaj porady - jeśli musisz się zastanawiać, co tutaj wsadzić, znaczy że żadna z tych rzeczy nie jest dobrze pasująca. To trochę jakbyś poszedł na kurs obsługi młotka i po powrocie do domu szukał na siłę miejsc, gdzie można z młotka skorzystać: można nim ugniatać ziemniaki, zagarniać brud z podłogi, można ubijać ziemię w doniczce z kwiatkiem. Niby można, ale to takie siłowe i bez większego sensu. Zostaw młotek w szafce i skorzystaj z niego, kiedy serio poczujesz, że jest taka potrzeba, gdy pojawi się sytuacja, w której serio młotka się używa - typu wbicie gwoździa.

screenshot-20241103144523.png


P1
  • Rejestracja:około 7 lat
  • Ostatnio:około 2 miesiące
  • Postów:179
1

@cerrato: Nie szukam na siłę wzorców które można tu zastosować. To było pytanie czy jest to dobry kierunek. Jeśli opinia bardziej doświadczonych ludzi mówi że nie warto lub jest to zły kierunek to nie będę udowadniał na siłę że jest inaczej.Chcę w życiu starać się pisać profesjonalny kod i stosować dobre praktyki (lecz czasami mnie to gubi 😅 ) . To może jakieś nakierowanie na jakiś temat lub nawet jakiś prosty przykład. Ostatnio przeszukiwałem internet i strony takie jak stack , medium i albo nie umiem szukać , albo nie ma takich artykułów , postów.

Jeśli do udzielenia odpowiedzi potrzeba więcej informacji to chętnie udzielę wszystkie potrzebne dane itp.

edytowany 1x, ostatnio: pestka12
Miang
  • Rejestracja:prawie 7 lat
  • Ostatnio:3 minuty
  • Postów:1659
0
pestka12 napisał(a):

Mi chodziło o coś takiego w kwestii dziedziczenia. Przykład napisany w C++ WxWidget:

Kopiuj
class AdminPanel : public wxFrame {
public:
    AdminPanel() : wxFrame(nullptr, wxID_ANY, "Admin Panel") {
        wxPanel* panel = new wxPanel(this);
        wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);

        sizer->Add(new wxStaticText(panel, wxID_ANY, "Welcome to Admin Panel"), 0, wxALL | wxCENTER, 10);
        panel->SetSizer(sizer);
    }
};

class UserPanel : public wxFrame {
public:
    UserPanel() : wxFrame(nullptr, wxID_ANY, "User  Panel") {
        wxPanel* panel = new wxPanel(this);
        wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);

        sizer->Add(new wxStaticText(panel, wxID_ANY, "Welcome to User Panel"), 0, wxALL | wxCENTER, 10);
        panel->SetSizer(sizer);
    }
};

I potem na podstawie danych z bazy wybieram odpowiednią ramkę która ma się wyświetlić. Czy idę myślą w dobrą stronę czy są jakieś lepsze sposoby na stworzenie tego systemu ?

Ale właściwie jakimi składowymi różnią się te panele? bo że się różnią tekstem wyświetlanym to wiemy ale czym jeszcze?


dzisiaj programiści uwielbiają przepisywać kod z jednego języka do drugiego, tylko po to by z projektem nadal stać w miejscu ale na nowej technologii
Miang
  • Rejestracja:prawie 7 lat
  • Ostatnio:3 minuty
  • Postów:1659
0
pestka12 napisał(a):

Mi chodziło o coś takiego w kwestii dziedziczenia. Przykład napisany w C++ WxWidget:

Kopiuj
class AdminPanel : public wxFrame {
public:
    AdminPanel() : wxFrame(nullptr, wxID_ANY, "Admin Panel") {
        wxPanel* panel = new wxPanel(this);
        wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);

        sizer->Add(new wxStaticText(panel, wxID_ANY, "Welcome to Admin Panel"), 0, wxALL | wxCENTER, 10);
        panel->SetSizer(sizer);
    }
};

class UserPanel : public wxFrame {
public:
    UserPanel() : wxFrame(nullptr, wxID_ANY, "User  Panel") {
        wxPanel* panel = new wxPanel(this);
        wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);

        sizer->Add(new wxStaticText(panel, wxID_ANY, "Welcome to User Panel"), 0, wxALL | wxCENTER, 10);
        panel->SetSizer(sizer);
    }
};

I potem na podstawie danych z bazy wybieram odpowiednią ramkę która ma się wyświetlić. Czy idę myślą w dobrą stronę czy są jakieś lepsze sposoby na stworzenie tego systemu ?

Ale właściwie jakimi składowymi różnią się te panele? bo że się różnią tekstem wyświetlanym to wiemy ale czym jeszcze?


dzisiaj programiści uwielbiają przepisywać kod z jednego języka do drugiego, tylko po to by z projektem nadal stać w miejscu ale na nowej technologii
Miang
o znou dwa razy się dodało
P1
  • Rejestracja:około 7 lat
  • Ostatnio:około 2 miesiące
  • Postów:179
0

@Miang: To był taki przykład. Mi chodzi o taki podział ról i wyświetlanie interfejsu jak jest np w programach magazynowych gdzie zwykły magazynier może wykonywać podstawowe czynności natomiast główny magazynier ma wyższe uprawnienia i na pewno ma inny interfejs bo dochodzą mu np przyciski którymi może generować raport gdzie zwykły magazynier po prostu tych przycisków nie widzi w interfejsie z powodu swojej roli. W skrócie chodzi mi o zasadę RBAC i podział różnych interfejsów na każdą rolę.

Miang
  • Rejestracja:prawie 7 lat
  • Ostatnio:3 minuty
  • Postów:1659
2

@pestka12: No bo podałeś przykład gdzie sama definicja klasy byłaby jedna ,tylko z różnymi wartościami pola przechowującego tekst dla nagłówka
jeżeli panel dla admin będzie miał też dodatkowe przyciski no to właśnie dziedziczenie z klasy Panel i rozbudowanie jej o dodatkowe elementy
Może też być że jakiś podpanel jest umieszczony na tym panelu lub nie w zależności od usera
btw. po naciśnięciu przycisku jeszcze raz powinno być sprawdzone czy ten user miał prawo widzieć ten przycisk i wykonać daną czynność


dzisiaj programiści uwielbiają przepisywać kod z jednego języka do drugiego, tylko po to by z projektem nadal stać w miejscu ale na nowej technologii
P1
Już chyba wiem o co chodzi. Dziedziczyć sobie z klasy np wxPanel a potem na podstawie roli ustawiać odpowiedni panel do wyświetlenia w użytkownikowi. I wiem że po wciśnięciu przycisku powinna być weryfikacja czy ma uprawnia do jej wykonania i jest to rola po stronie serwera.
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 16 godzin
  • Postów:3277
1

@pestka12 Skupiasz się na pierdołach. Jesteś początkujący (wnioskuję po pytaniach), skup się na tym, żeby zrobić zadanie, które sobie wymyśliłeś, nie na tym jakie wzorce projektowe do tego zastosować.
Odseparuj logikę od UI, sprawdzaj rolę na poziomie logiki. Jeżeli masz gdzieś metodę deleteUser(userId: int) to wewnątrz tej metody masz sprawdzić, czy aktualny użytkownik ma przypisaną rolę administratora. Możesz sobie zrobić wrapper na logikę i na tym poziomie sprawdzać rolę, albo dodać parametr z rolą, czy całym obiektem użytkownika.
Jeżeli UI, które widzi zwykły użytkownik ma być inne od UI widzianego przez administratora, to rób 2 panele, mogą dziedziczyć po wspólnym rodzicu (i to raczej implementować wspólny interface, niż faktycznie korzystać z dziedziczenia). Z typowego dziedziczenia rzadko kiedy wynika coś dobrego, a w przypadku UI, to już chyba wcale.

Jak już chcesz zastosować jakieś wzorce, to możesz zapakować sobie pokazywanie tych paneli w jakąś metodę fabrykującą, która ci zwróci odpowiednią wersję UI w zależności od tego jaka jest rola użytkownika.

Miang
  • Rejestracja:prawie 7 lat
  • Ostatnio:3 minuty
  • Postów:1659
1
piotrpo napisał(a):

Odseparuj logikę od UI, sprawdzaj rolę na poziomie logiki. Jeżeli masz gdzieś metodę deleteUser(userId: int) to wewnątrz tej metody masz sprawdzić, czy aktualny użytkownik ma przypisaną rolę administratora. Możesz sobie zrobić wrapper na logikę i na tym poziomie sprawdzać rolę, albo dodać parametr z rolą, czy całym obiektem użytkownika.

wywołać funkcję , która sprawdzi czy zalogowany użyszkodnik może wykonać akcję 'delete_user'
nie zapisywać w metodzie deleteUser kto ma prawo zrobić delete (że 'admin') bo to się może zmienić


dzisiaj programiści uwielbiają przepisywać kod z jednego języka do drugiego, tylko po to by z projektem nadal stać w miejscu ale na nowej technologii
P1
  • Rejestracja:około 7 lat
  • Ostatnio:około 2 miesiące
  • Postów:179
0

@piotrpo: Dziękuje za wiele cennych rad. Jestem studentem 3 roku informatyki ekonomicznej i jako student studiując dziennie ciężko mi się załapać do jakieś firmy więc na razie moje doświadczenie wynosi 0 ale nadrabiam to rozwijać swoją pasję prywatnie i ciągle czytając różne artykuły i książki (Głowna tematyka to C++ i Assembler i czasami jakaś pozycja o javie). Liczę że jak obronię magisterkę to uda mi się gdzieś załapać i rozwijać się dalej w swojej pasji.

Pozdrawiam serdecznie.

Miang
Grębosza czytaj
HS
  • Rejestracja:10 miesięcy
  • Ostatnio:3 dni
  • Postów:74
0
piotrpo napisał(a):

Jeżeli masz gdzieś metodę deleteUser(userId: int) to wewnątrz tej metody masz sprawdzić, czy aktualny użytkownik ma przypisaną rolę administratora.

Jezeli uzytkownik nie ma przypisanych jakichkolwiek przywilejow do wykonywania wybranej akcji, to do tej akcji (lub jak wolisz metody), nie ma prawa nawet sie zblizyc, tymbardziej (zakladajac, ze tworzysz SOLIDny kod) wykonywac w niej dodatkowo autoryzacje.

Miang
ja tego co napisałeś nie kumam, w jaki sposób zbliżyć?
HS
@Miang: sorry, skrot myslowy. Mialem na mysli przebieg procesu (code execution), nazwij to jak Ci wygodniej. Akcja powinna byc spieta z przywilejem, przywilej z rola, a rola z uzytkownikiem. Na upartego mozesz jeszcze podpiac access level tak zeby dodatkowo nawet na tym samym przywileju dodac dodatkowy poziom hierarchi. Chodzi o to, ze podobnie jak w przypadku persystencji do bazy, walidujesz dane, tak samo zanim wykonasz jakakolwiek akcje "walidujesz" (autoryzujesz) uzytkownika i stanowczo ta autoryzacja nie powinna miec miejsca w metodzie usuwajacej cokolwiek z bazy.
Miang
no to jeszcze bardziej nakomplikowałeś. co rozumiesz przez 'akcja' patrząc z punktu widzenia kodu?
HS
@Miang: zerknij ponizej, bo widze ze @piotrpo zreflektowal sie, ze sie "troche" zagalopowal i wprowadzil korekte do swojej wypowiedzi i ostatecznie zgrabnie to wylozyl tak jak nalezy. Chodzi o wymieniony przez niego punkt: kontrola dostepu .... Uzyl pojecia funkcja (z perspektywy kodu), ja posluzylem sie terminem akcja (z punktu widzenia funkcjonalnosci), ale sprowadza sie to jednego, usun, dodaj, zapisz etc.
piotrpo
Funkcja użyłem jako "funkcji aplikacji/systemu", a nie funkcji w kodzie. Może być mylące i faktycznie trochę mnie wyobraźnia poniosła wyżej.
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 16 godzin
  • Postów:3277
1

@pestka12 Zamiast stosować wzorce na siłę pomyśl o tym jak podzielić program na pojedyncze odpowiedzialności, w co je zapakować, jak tworzyć te obiekty i jak je poskładać do kupy. Odpowiedzialności jakie ja tutaj widzę:

  • uwierzytelnianie (określenie tożsamości użytkownika) logika + UI
  • autoryzacja (Określenie uprawnień użytkownika o znanej tożsamości)
  • kontrola dostępu (sprawienie, że użytkownik bez odpowiedniej roli nie wywoła funkcji, której wywoływać mu nie wolno
  • logika biznesowa, czyli realizacja funkcji wywoływanych przez użytkowników, lub innych aktorów
  • wyświetlanie UI administratora
  • wyświetlanie UI użytkownika

I w tym miejscu można zacząć myśleć o tym jak to składać do kupy. Pewnie za każdą z tych linijek powinna odpowiadać osobna klasa. Kontrola dostępu może być wrapperem na logikę biznesową. Panele user/admin mogą być zwracane przez jakąś metodę fabrykującą.

edytowany 2x, ostatnio: piotrpo
Zobacz pozostałe 11 komentarzy
Miang
@pestka12: nie przejmuj się komentarzami pod tym postem ;)
piotrpo
@Miang: a ja sie tu będę upierać przyzwyczaiłem się. :)
HS
@Miang: calkiem mozliwe, ze masz racje, calkiem mozliwe ze za chwile odezwie sie jakis akademik ktory mnie za chwile "wyprostuje", w tej chwili jednak mi to osobiscie nie przeszkadza, a moze inaczej, moj obecny stan wiedzy i praktyki nie pozwala mi znalezc zadnych argumentow przeciw :)
HS
@Miang: a co do przeniesienia tej dyskusji na Semantyczne rozmycie terminow ... to faktycznie moglby byc dobry pomysl. Poza tym fajnie by bylo, ten temat w ogole zawezic i definitywnie skonfrontowac rozumienie terminologii pojeciowej wylacznie w zakresie struktury aplikacji.
P1
  • Rejestracja:około 7 lat
  • Ostatnio:około 2 miesiące
  • Postów:179
0

Dziękuję bardzo wszystkim za cenne rady oraz informacje. Według mnie temat jest do zamknięcia i może przyda się przyszłym pokoleniom 😁

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)