postgree + C# : uprawnienia dostępu do poszczególnych elementów w aplikacji. Stałę połączenie z bazą

0

Witam.
Swojego czasu zapoznałem się z połączeniem do bazy danych postgre z poziomu aplikacji napisanej w c#.

Muszę napisać pewien projekt na zajęcia z programowania i w jego założeniach mam zaplanowane zrobić konta użytkowników z różnymi poziomami uprawnień (powiedzmy user, szef, super_administrator).

Konta są zakładane w programie postgre oraz będzie możliwość ich zakładania z poziomu aplikacji c#. Z tego co się orientuję po zalogowaniu przez użytkownika, dane konta pojawiają się w zarządzaniu komputerem w usługach lokalnych grup i użytkowników w windowsie.

Przechodząc do sedna.

Program posiadałby paski szybkiego dostępu oraz ma formatkę do której wrzuciłem tabcontrol1. W tabcontrol mam tabpage1, tabpage2, tabpage3, tabpage4.

Dla zwykłego usera chciałbym nadać uprawnienia dostępu do tabpage1, tabpage2. Dla szefa nadać uprawnienia do tego co ma user + tabpage3. A superadmin miałby dostęp tylko do zakładki tabpage4 w której byłyby zakładane konta użytkowników.

Po odpaleniu programu, pojawia się okno logowania (nowa formatka) przez które, mogą się logować poszczególni użytkownicy.

Teraz następuje pytanie.
W jaki sposób oprogramować kod w c#, żeby program weryfikował, czy zalogowany użytkownik posiada uprawnienia do poszczególnych buttonów zakładek czy opcji na pasku szybkiego wybierania ?
Jak sprawdzić czy użytkownik istnieje w bazie kont użytkowników ?


Mam jeszcze pytanie dotyczace połączenia z bazą danych.
Podczas gdy naciskam poszczególne buttony, uruchamiają mi się poszczególne procedury dodające, usuwające lub edytujące bazę danych. w Kodzie używam między innymi

button
{
....
conn.open()
...
kod c#+ zapytania sql
...
conn.close()
}
Co oznacza że za każdym razem otwieram oraz zamykam połączenie z bazą danych .

Jak zrobić, żeby połączenie z bazą danych trwało cały czas po zalogowaniu użytkownika i rozłączenie następowałoby tylko wtedy, gdy zamykany byłby program lub podczas gdy następowałoby przelogowanie na inne konto ?

0
Incognito napisał(a)

W jaki sposób oprogramować kod w c#, żeby program weryfikował, czy zalogowany użytkownik posiada uprawnienia do poszczególnych buttonów zakładek czy opcji na pasku szybkiego wybierania ?

Trochę nie do końca rozumiem. Chodzi o użytkownika bazy danych? domyślnie superadminem jest user o nazwie postgres. Możesz dodać inne role do bayt danych. W danej roli możesz np ograniczyć tylko do odczytu z danych tabel itd.

Jeżeli chodzi o tabele w której po prostu trzymasz userów to zrób klasę Użytkownik z polami login/id i uprawnienia. W tabeli Użytkownicy dodaj kolumnę Uprawnienia i po zalogowaniu ściągnij odpowiednie wartości, a potem już tylko odpowiednio zrobisz warunki: np. jeżeli Uprawnienia == 1 to usuń zakładkę 3 i 4.
To jest taki bardzo prosty sposób. Z tego co wiem w .Necie jest jakieś mądrzejsze narzędzie do logowania. Tu pierwszym problemem jest chociażby nieskończona sesja itp - choć to też można rozwiązać :)

Incognito napisał(a)

Jak sprawdzić czy użytkownik istnieje w bazie kont użytkowników ?

Bardzo prostym SELECTEM do bazy: select login, usprawnienia FROM uzytkownicy WHERE id = 23 AND password = 'tajneHaslo'

hasło oczywiście nie na czysto tylko zakodowane.

Incognito napisał(a)

Podczas gdy naciskam poszczególne buttony, uruchamiają mi się poszczególne procedury dodające, usuwające lub edytujące bazę danych. w Kodzie używam między innymi

button
{
....
conn.open()
...
kod c#+ zapytania sql
...
conn.close()
}
Co oznacza że za każdym razem otwieram oraz zamykam połączenie z bazą danych .

Jak zrobić, żeby połączenie z bazą danych trwało cały czas po zalogowaniu użytkownika i rozłączenie następowałoby tylko wtedy, gdy zamykany byłby program lub podczas gdy następowałoby przelogowanie na inne konto ?

no to może singleton?

0
neversoft napisał(a)

Trochę nie do końca rozumiem. Chodzi o użytkownika bazy danych? domyślnie superadminem jest user o nazwie postgres. Możesz dodać inne role do bayt danych. W danej roli możesz np ograniczyć tylko do odczytu z danych tabel itd.

Jeżeli chodzi o tabele w której po prostu trzymasz userów to zrób klasę Użytkownik z polami login/id i uprawnienia. W tabeli Użytkownicy dodaj kolumnę Uprawnienia i po zalogowaniu ściągnij odpowiednie wartości, a potem już tylko odpowiednio zrobisz warunki: np. jeżeli Uprawnienia == 1 to usuń zakładkę 3 i 4.
To jest taki bardzo prosty sposób. Z tego co wiem w .Necie jest jakieś mądrzejsze narzędzie do logowania. Tu pierwszym problemem jest chociażby nieskończona sesja itp - choć to też można rozwiązać :)

Dzisiaj się dowiedziałem , że ze względów bezpieczeństwa lepiej się nie trzymać zakładania kont w samym postgresie :) Z tego c zrozumiałem najlepiej jest zrobić trzy-wartwowy model zabezpieczeń ( dla aplikacji, interfejsu oraz bazy danych). Więc według tego najpierw będzie sprawdzany dostęp na poziomie aplikacji C#, na tej podstawie zablokuję część opcji w interfejsie i dopiero później będę nawiązywać połączenie z aplikacją bazo-danową postgre.

Zmieniłem lekko koncepcję projektu i w samej aplikacji C# założę tabelę dla kont użytkowników (narzędzie datasource).
Będę w niej trzymał login, hasło oraz przynależność do grupy. Jeśli login i hasło bedą indentyczne jak pozycje w tabeli, oraz nastąpi sprawdzenie do jakiej "grupy" użytkowników to konto należy, to wtedy będę nawiązywać połączenie z bazą danych. Po logowaniu w trakcie nawiązywania połączenia z bazą w postgre, będę tworzyć za pomocą zapytań sql konto użytkownika, które będzie później przypisywane do właściwej grupy. Po zakończonej pracy konto będzie usuwane a dane logowania będą zapisywane do jakiegoś pliku.
Nie wiem czy ten sposób autoryzacji jest zalecany (chodzi o tworzenie i usuwanie konta) , ale to jedyne co mi przychodzi do głowy ;) Chyba , że ktoś może mi polecić lepsze sposoby logowania się do aplikacji w c# jak i w bazie danych ;)

I teraz zaczynają sie schody.
Bo jeśli nastąpi połączenie z bazą, po czym utracę je. To wprowadzone przeze mnie zmiany (dodanie konta użytkownika i nadanie praw w postgre) zostaną utracone ? Czy wręcz przeciwnie, będę mógł je usunąc dopiero za pomocą zapytania sql za pomocą buttona ?

Teoretycznie, jeśli dojdę do tego jak podczas logowania nadawać prawa w aplikacji oraz postgre, to reszta projektu potoczy sie z górki na wózku :) Gdyż pozostanie mi tylko kodowanie zapytan w SQL (C# procedury mam na ukończeniu).

0

a jak dodamy użytkowników? jak pobierzesz hasła i loginy do aplikacji aby były aktualne? no i po co ciągle tworzyć tam konta?
trzymanie haseł w kodzie źródłowym też jest z tego co wiem niebezpieczne. Nie rozumiem chyba do końca tego rozwiązania :)

0
neversoft napisał(a)

a jak dodamy użytkowników? jak pobierzesz hasła i loginy do aplikacji aby były aktualne? no i po co ciągle tworzyć tam konta?
trzymanie haseł w kodzie źródłowym też jest z tego co wiem niebezpieczne. Nie rozumiem chyba do końca tego rozwiązania :)

W sumie jeśli w aplikacji C# założę tabelę "users", która będzie odpowiednikiem kont użytkowników i grup w postgre. I będę zakładać te konta w aplikacji tylko z konta z prawami administratora. Wtedy to zakładanie i usuwanie kont w postgre poprzez sql , podczas logowania do aplikacji mija sie lekko z celem.

Zależy mi na tym, aby aplikacja w C#, podczas procesu logowania weryfikowała grupę użytkownika, żeby dostosować wygląd programu pod zwykłego pazia (wyłączenie funkcjonalności dzięki którym mógłby napaskudzić w bazie danych) lub pod admina zanim w ogóle nastąpi połączenie z właściwą bazą danych.

Chciałbym żeby prawa dostępu do tabel dla grup w postgre == prawa dostępu do kontrolek w c#.
(jeśli wyłączona zostaje tabela , to jednocześnie wyłączam dostęp dla użytkownika do tego tabpage gdzie ta tabela się znajduje).

Doszedłem do wniosku, że stworzę jeden wiersz w tabeli "users" z danymi konta admina, po którego zalogowaniu się do aplikacji c# będę mieć dostęp do wszelkich funkcjonalności w programie i przy tych opcjach, gdzie trzeba będzie dokonywać zmian w postgre (zakładanie kont, nadawanie praw czy edycja tabel) będę logować się na konto postgresa z innej formatki za pomoca textboxów podając serwer, port, nazwę bazy oraz login i hasło.

Podczas tworzenia konta użytkownika będe zapisywać dane loginu, hasła oraz przynależności do grupy w tabeli "users" w aplikacji C# oraz poprzez komendy sql będę tworzyć konto uzytkownika i przypisywał je do grupy w postgre. Oczywiście nie muszę pisać, że posiadam w buttonie odpowiedzialnym za potwierdzenie logowania, instrukcje warunkowe, które sprawdzają poprawość wpisanego loginu i hasła. I dopiero gdy login i hasło będą się zgadzały z danymi w tabeli "users" to wtedy będzie nastąpywało połączenie z bazą (wartości loginu i hasła będa pobierane z textboxów).

Nie wiem czy mój tok rozumowania jest dobry, gdyż po raz pierwszy tworzę aplikację tego typu (C#+ baza danych). Dlatego kompletnie nie wiem za co się zabrać. I o ile biblioteki .ADO są dla mnie zrozumiałe a wyświetlanie wyników nie jest aż tak skomplikowane, to kompletnie nie wiem jak się zabrać za weryfikację użytkowników podczas procesu logowania. W taki sposób, żeby odbywało się bezpieczne logowanie.

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