![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 16.06.2011 Ostrzeżenie: (0%) ![]() ![]() |
Witam serdecznie.
Przegladalem caly dzial dotyczacy Postgresa. Otoz borykam sie z tym od kilku dni i jestem w kropce. Przejalem obsluge psql po adminie, ktory korzystal z cgi i c++ do obslugi bazy. Ja natomiast chcialbym troche to zrobic po swojemu no i jest problem. W c++ by polaczyc sie z okreslona baza wykorzystuje sie polecenie mag.connect, po tym okresla sie zmienna user i haslo. Po wpisaniu okreslonego user'a jak i hasla w formularzu logowania nastepuje polaczenie z okreslona baza. (Baza psql posiada zapisanych w "pg_user" okolo 10 uzytkownikow). Z tego co wyczytalem w necie przy php nie ma takiej mozliwosci - musze utworzyc dodatkowa baze uzytkownikow i korzystajac z niej logowac sie do bazy przez www. Czy moje rozumowanie jest prawidlowe, jezeli tak to troche bez sensu tworzyc dodatkowa baze uzytkownikow, jezeli sam psql przechowuje te informacje w swoich zasobach. Pomimo, ze funkcja pg_connect pozwala stosowac zmienne odnosnie uzytkownika i hasla to jednak nie pozwala dostac sie bezposrednio do zapisanych w psql'u uzytkownikow. Prosze o rozwianie moich watpliwosci. Pozdrawiam Jacek ps. klawiatura bez polskich znakow Ten post edytował sbs2005 16.06.2011, 18:24:59 |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
Twoje rozumowanie jest prawidłowe, i już Ci tłumaczę dlaczego tak jest robione, dla wygody.
Możesz tworzyć użytkowników postgresql'a będących użytkownikami do zalogowania się do jakiegoś systemu, bądź tworzyć osobną tabelę z danymi użytkownika do logowania się. Były administrator widać stara szkoła, nie wymyślał koła na nowo, tylko wykorzystał to co już mu daje postgresql, czyli bazę użytkowników, uprawnienia do tabel, kolumn, można definiować względem użytkowników i grup co usprawnia ale i też komplikuje logikę, gdyż trzeba tego pilnować i mieć dość sporą wiedzę na ten temat. Pozdrawiam, Przemek. -------------------- cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 16.06.2011 Ostrzeżenie: (0%) ![]() ![]() |
Twoje rozumowanie jest prawidłowe, i już Ci tłumaczę dlaczego tak jest robione, dla wygody. Możesz tworzyć użytkowników postgresql'a będących użytkownikami do zalogowania się do jakiegoś systemu, bądź tworzyć osobną tabelę z danymi użytkownika do logowania się. Były administrator widać stara szkoła, nie wymyślał koła na nowo, tylko wykorzystał to co już mu daje postgresql, czyli bazę użytkowników, uprawnienia do tabel, kolumn, można definiować względem użytkowników i grup co usprawnia ale i też komplikuje logikę, gdyż trzeba tego pilnować i mieć dość sporą wiedzę na ten temat. Pozdrawiam, Przemek. Dzieki za odpowiedz ![]() Wiesz, chodzi mi wlasnie by skorzystac tak jak w c++ z dostepnych uzytkownikow zapisanych w bazie psql. Wszedzie w necie sa przyklady na zalozonej dodatkowej tabeli z user'ami. Nie ma natomiast przykladu z dostepem do bazy bez dodatkowej tabeli/bazy uzytkownikow. Nie wiem jak rozgryzc. A potrzebuje tego by wogole zaczac przerabiac wyglad formularza - wszak moj poprzednik jest niesamowita skarbnica wiedzy i szanuje go bardzo to do estetyki wizualnej tyle mu co mi do pilota awionetki ![]() pzdr Jacek |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
Źle rozumujecie. Każdy taki użytkownik będzie miał możliwość połączenia się z bazą danych za pomocą dowolnego klienta. Jeśli dodatkowo nie będziesz kontrolował uprawnień tych użytkowników, to będą z tego niezłe "jaja" - za przeproszeniem. Wspomniane jaja będą już nawet wtedy, gdy skontrolujesz uprawnienia tych użytkowników (ograniczając im możliwość wykonywania zapytań do SELECT, UPDATE, INSERT). Załóżmy, że dany użytkownik prowadzi blog (jak i inni użytkownicy). I teraz jeśli on ma możliwość edycji własnego wpisu, to i ma możliwość edycji wpisów innych użytkowników (z poziomu dowolnego klienta), no chyba, że każdemu użytkownikowi będziesz tworzył osobną tabelę (a nawet kilka, czy kilkanaście tabel) lub nawet osobną bazę danych z takimi samymi tabelami, jak w przypadku innych użytkowników i przydzielał mu uprawnienia tylko do tych tabel czy baz danych. W ogóle "kosmos". Daj takiemu użytkownikowi uprawnienie do DELETE i szlag trafi wszystko.
Użytkownicy systemu baz danych (Ci z tabeli pg_user w przypadku PostgreSQL) to tacy, których dane nie powinny być nigdzie ujawnione na poziomie aplikacji (czy to w PHP, czy w C++, czy w czymkolwiek innym). Użytkownicy aplikacji "niejawnie" posługują się danymi użytkownika systemu baz danych (zazwyczaj i tak posiadającego niezbędne minimum uprawnień), aby łączyć się z określoną bazą danych (może ich być więcej) i operować w ramach tylko i wyłącznie tej bazy (tych baz). To co użytkownik może zrobić, zależy od tego jak oprogramujesz obsługę takiego użytkownika we własnej aplikacji. Tabela pg_user powinna być zatem wykorzystywana w aplikacjach służących do zarządzania systemem baz danych PostgreSQL. Obsługę użytkowników danej aplikacji należy zorganizować na poziomie tej aplikacji (np. tabela users w odpowiedniej bazie danych), a nie systemu baz danych. Ten post edytował mortus 17.06.2011, 10:46:47 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 16.06.2011 Ostrzeżenie: (0%) ![]() ![]() |
Tabela pg_user powinna być zatem wykorzystywana w aplikacjach służących do zarządzania systemem baz danych PostgreSQL. Tobie rowniez dziekuje za odpowiedz. Troszeczke opowiem o calym systemie - nie pisalem wczesniej bo to nie bylo przedmiotem dywagacji. Wszyscy uzytkownicy posiadaja odpowiednie uprawnienia na poziomie pg_user wedlug okreslonych kryteriow - kazdy user ma okreslone uprawnienia do poszczegolnych tabel w bazach. Uzytkownik teraz - logujac sie poprzez odczytanie z pg_user informacji i uprawnien do okreslonej tabeli w bazie nie zrobi niczego innego co ma do wykonania - tak to ma dzialac i dziala. System bazodanowy jest systemem w archiwum instytucji - tylko pracownicy jednostki maja dostep do bazy w sieci Intranetowej. Pracownicy dodaja okreslone rekordy do bazy lub wyszukuja informacji tylko i wylacznie wedlug okreslonych uprawnien nadanych do poszczegolnych tabel w bazach - jak juz wspomnialem. Nie ma mozliwosci by user z uprawnieniami "do odczytu" mogl dodac rekord do bazy. Poza tym Panie wiedza co maja robic w swoim zakresie obowiazkow. To nie jest baza do uzytku zewnetrznego - ma za zadanie gromadzic informacje i je przechowywac i to czyni sukcesywnie (w sumie to kilka baz - wiadomo o co chodzi). Chodzi tylko o ten dostep z poziomu PHP do bazy bezposrednio z pg_user - jak to zrobic. Naprawde nie ma mozliwosci.... Jacek Ten post edytował sbs2005 17.06.2011, 11:21:42 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
Ale jeżeli użytkownik ma zapisane odpowiednie uprawnienia i istnieje w tabeli pg_user to nie trzeba dodatkowo tych uprawnień sprawdzać, bo i tak user nie wykona czegoś, czego wykonać nie może. Dostanie po prostu komunikat o braku dostępu do danego zasobu, przy próbie wykonania jakiejś operacji.
Do połączenia wykorzystujesz pg_connect i tyle. pg_connect łączy z serwerem PostgreSQL właśnie poprzez tabelę pg_user. Z uprawnieniami jest tak, jak pisałem wyżej. |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
Chodzi tylko o ten dostep z poziomu PHP do bazy bezposrednio z pg_user - jak to zrobic. Naprawde nie ma mozliwosci.... Bo nie ma takiej potrzeby ![]() Pozdrawiam, Przemek. @edit mortus był szybszy. Ten post edytował cojack 17.06.2011, 11:41:06 -------------------- cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
Dodam jeszcze, że oprogramowanie aplikacji od tej strony, sprowadza się do oprogramowania obsługi błędów funkcji z przedrostkiem pg_.
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 16.06.2011 Ostrzeżenie: (0%) ![]() ![]() |
Dodam jeszcze, że oprogramowanie aplikacji od tej strony, sprowadza się do oprogramowania obsługi błędów funkcji z przedrostkiem pg_. mortus i cojack - nie mowcie ze jak wskaze baze do ktorej chce sie polaczyc - dajmy na to "zasoby" i potem okresle zmienna user'a i haslo potem napisze skrypt do logowania sie ze strony - to haslo jak i user beda odczytane z pg_user bez wskazywania na tabele, w ktorej sie znajduje ten plik (pg_user) - to takie proste ma byc ![]() |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
mortus i cojack - nie mowcie ze jak wskaze baze do ktorej chce sie polaczyc - dajmy na to "zasoby" i potem okresle zmienna user'a i haslo potem napisze skrypt do logowania sie ze strony - to haslo jak i user beda odczytane z pg_user bez wskazywania na tabele, w ktorej sie znajduje ten plik (pg_user) - to takie proste ma byc ![]() Dokładnie tak z tym, że login użytkownika, jak i hasło nie będą odczytywane z tabeli pg_user, ale porównywane z zawartością właśnie tej tabeli i jeśli się tam znajdą nastąpi połączenie. Jeśli odpowiednich danych w tabeli pg_user nie będzie, to funkcja zwróci błąd z komunikatem o braku dostępu. A co ważniejsze to nie tylko w PHP tak działa, ale również w C++ i innych językach programowania. Po prostu jeśli użytkownik jest użytkownikiem systemu baz danych i w tym systemie ma nadane jakieś uprawnienia, to zadaniem tego systemu jest kontrolowanie dostępu do określonych zasobów. Jeśli użytkownik nie ma odpowiednich uprawnień, to dostaje komunikat o braku uprawnień. Tyle. I tak jak mówię, w taki sam sposób działa to spod PHP, jak i spod C++, czy w ogóle każdego języka programowania. EDIT PHP-owa funkcja pg_connect, to tylko swego rodzaju "interfejs" do połączenia z systemem baz danych PostgreSQL. Funkcje z przedrostkiem pg_ to natomiast "interfejsy" do wykonywania innych działań na systemie baz danych PostgreSQL. Cytat W c++ by polaczyc sie z okreslona baza wykorzystuje sie polecenie mag.connect, po tym okresla sie zmienna user i haslo. Po wpisaniu okreslonego user'a jak i hasla w formularzu logowania nastepuje polaczenie z okreslona baza. (Baza psql posiada zapisanych w "pg_user" okolo 10 uzytkownikow). W opisanym przez Ciebie przypadku wspomnianym interfejsem jest obiekt mag, którego klasy nie znamy. Natomiast jeśli w tabeli pg_user jest 10 użytkowników, to w całej instytucji tylko tych 10 użytkowników może pracować na bazie danych (chyba, że architektura systemu wygląda inaczej, niż to opisałeś kilka postów wyżej). Ten post edytował mortus 17.06.2011, 13:39:30 |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 16.06.2011 Ostrzeżenie: (0%) ![]() ![]() |
Nowe informacje poradzilem sobie
![]() chcialbym zrobic sprawdzenie loginu i hasla - jezeli roznia sie od tych w bazie to powienien wyskoczyc blad, jednak nie wiem jak to poprawic (kombinowalem na rozne sposoby). Gdy uporam sie z tym to podam cale rozwiazanie. Kod <?php session_start(); $host="localhost"; $login=$_POST['login']; $haslo=$_POST['haslo']; $dbname="jp"; if (isset($_POST['loguj'])) { $link=@pg_connect("host=$host user=$login password=$haslo dbname=$dbname"); if ($link) { $_SESSION['zalogowany'] = $_POST['login']; header("location:chroniona.php"); } /* ~~~ Tu zaczyna sie moja zagwostka ~~~ */ //tak nie dziala /* if(!isSet($_POST["haslo"]) || !isSet($_POST["login"])) { $_SESSION['komunikat'] = "Wprowadz poprawna nazwe uzytkownika i haslo:"; include('form.php'); } */ //tak tez nie /* if ($login!=$_POST['login'] || $haslo!=$_POST['haslo']) { $_SESSION['komunikat'] = "Wprowadz poprawna nazwe uzytkownika i haslo:"; include('form.php'); } */ /* ~~~ Mam tak, ale chcialbym pokombinowac z tym z gory ~~~ */ else { header("location:error.php"); } if(isSet($_SESSION['zalogowany'])){ header("location:chroniona.php"); } } ?> kawalek form.php Kod <form method="POST" action="login.php" > <b>Nazwa uzytkownika:</b> <br> <input type="text" name="login"> <br> <b>Hasło:</b> <br> <input type="password" name="haslo"> <br><br> <input type="submit" value="loguj" name="loguj"> </form> </body> </html> jakies pomysly pzdr Jacek Ten post edytował sbs2005 21.06.2011, 22:14:10 |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
Tylko tak, innej możliwości nie ma. Co do całego rozwiązania, to naprawdę musisz bardzo dokładnie kontrolować uprawnienia użytkowników, żeby np. ktoś nie wykasował wszystkich rekordów z tabel w bazie danych. |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 16.06.2011 Ostrzeżenie: (0%) ![]() ![]() |
Tylko tak, innej możliwości nie ma. Co do całego rozwiązania, to naprawdę musisz bardzo dokładnie kontrolować uprawnienia użytkowników, żeby np. ktoś nie wykasował wszystkich rekordów z tabel w bazie danych. Kurna nie pomyslalem by zaczac od negacji - baran ze mnie ![]() Dzisiaj przetestuje i zobacze. Wiem, wiem mortus - kontrola na poziomie bazy danych jest tu szczegolowo okreslona i podporzadkowana wytycznym. Formularze stworzone przeze mnie na podstawie baz beda pozwalac na dodawanie i edytowanie rekordow ew. wyszukiwac i drukowac okreslone informacje. Pzdr i zabieram sie do testowania Jacek |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
Kurna nie pomyslalem by zaczac od negacji - baran ze mnie ![]() Nie chodzi o samą negację, ale o umieszczenie linijki w odpowiednim bloku instrukcji if ... else .... Wiem, wiem mortus - kontrola na poziomie bazy danych jest tu szczegolowo okreslona i podporzadkowana wytycznym. Formularze stworzone przeze mnie na podstawie baz beda pozwalac na dodawanie i edytowanie rekordow ew. wyszukiwac i drukowac okreslone informacje. Tylko musisz wiedzieć, że przy takim podejściu, jakie zastosowałeś, użytkownik nie potrzebuje Twojego formularza, bo może się połączyć z serwerem za pomocą dowolnego zewnętrznego klienta. Wtedy wszystko "jawnie" widzi (np. całą tabelę w określonej bazie danych) i może nabroić mając choćby przywilej do UPDATE. Dlatego w ramach jednego systemu autoryzację przeprowadza się poprzez tabelę użytkowników tego systemu, a nie poprzez konta użytkowników samego PostgreSQL-a, MySQL-a, czy tym podobnego. I to niezależnie od zastosowanego języka programowania. Pisałem o tym w pierwszej mojej odpowiedzi tutaj. |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 16.06.2011 Ostrzeżenie: (0%) ![]() ![]() |
A wiec podaje rozwiazanie mojego problemu
![]() Opis problemu: Logowanie do bazy bez dodatkowej tabeli USERS - w wielu periodykach/ksiazkach znajdziemy przyklady oparte o dodatkowa tabele/baze user. Baza pracuje w Intranecie, bez dostepu z zewnatrz do niej. Osoby obslugujace bazy w wieku dojrzalym i swiadomosci obslugi systemu - na zasadzie - tu prosze kliknac - jezeli cos nie dziala wzywamy informatyka bo cos sie wyswietlilo ![]() Jezeli ktos ze chce przerobic na mysql to nalezy pozmieniac okreslone polecenia. Najwazniejsze - jak koledzy wspominali - nalezy miec swiadomosc ze bezposredni dostep do bazy musi byc okreslony szczegolowymi uprawnieniami dla user'ow w tablicach systemowych pg_user (nie wiem jak jest w mysql). A wiec do dziela: plik: login.php
formularz logowania: index.php
gdy uzytkownik i haslo sie zgadzaja: chroniona.php
strona wylogowania i zamkniecia sesji: logout.php
jezeli wprowadzisz zle - uzytkownika lub haslo: error.php to na tyle - jezeli ktos ma jakies pytania to smialo pytac pzdr Jacek Ten post edytował sbs2005 24.06.2011, 09:49:56 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 04:38 |