Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: logowanie do bazy bez nazwy user'a
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
sbs2005
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
cojack
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.
sbs2005
Cytat(cojack @ 17.06.2011, 09:35:37 ) *
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 smile.gif

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 smile.gif

pzdr
Jacek
mortus
Ź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.
sbs2005
Cytat(mortus @ 17.06.2011, 11:39:35 ) *
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
mortus
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.
cojack
Cytat(sbs2005 @ 17.06.2011, 12:15:44 ) *
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 wink.gif Jak się zalogujesz używając użytkownika z postgresql to się zalogujesz a jak nie tzn że go nie ma ;]

Pozdrawiam,
Przemek.

@edit
mortus był szybszy.
mortus
Dodam jeszcze, że oprogramowanie aplikacji od tej strony, sprowadza się do oprogramowania obsługi błędów funkcji z przedrostkiem pg_.
sbs2005
Cytat(mortus @ 17.06.2011, 12:44:45 ) *
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

smile.gif
mortus
Cytat(sbs2005 @ 17.06.2011, 13:16:04 ) *
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

smile.gif

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).
sbs2005
Nowe informacje poradzilem sobie biggrin.gif ale mam inny problem ;/
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
mortus
  1. <?php
  2.  
  3. $host = "localhost";
  4. $login = $_POST['login'];
  5. $haslo = $_POST['haslo'];
  6. $dbname = "jp";
  7.  
  8. if(isset($_POST['loguj'])) {
  9. $link =@pg_connect("host=$host user=$login password=$haslo dbname=$dbname");
  10. if(!$link) {
  11. $_SESSION['komunikat'] = "Wprowadz poprawną nazwe uzytkownika i haslo:";
  12. header("location:error.php");
  13. } else {
  14. $_SESSION['zalogowany'] = $_POST['login'];
  15. header("location:chroniona.php");
  16. }
  17. }
  18. ?>

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.
sbs2005
Cytat(mortus @ 22.06.2011, 09:45:00 ) *
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 smile.gif zmeczenie organizmu chyba dalo sie we znaki
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
mortus
Cytat(sbs2005 @ 22.06.2011, 20:13:59 ) *
Kurna nie pomyslalem by zaczac od negacji - baran ze mnie smile.gif

Nie chodzi o samą negację, ale o umieszczenie linijki
  1. $_SESSION['komunikat'] = "Wprowadz poprawną nazwe uzytkownika i haslo:";
w odpowiednim bloku instrukcji if ... else ....

Cytat(sbs2005 @ 22.06.2011, 20:13:59 ) *
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.
sbs2005
A wiec podaje rozwiazanie mojego problemu smile.gif
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 smile.gif
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
  1. <?php
  2.  
  3. $host="localhost"; //nazwa host'a gdzie jest polozona dzialajaca baza psql
  4. $login=$_POST['login']; //zmienna login uzyskana z wprowadzanych wartosci w formularzu logowania
  5. $haslo=$_POST['haslo']; //j.w.
  6. $dbname="nazwa_bazy"; //nazwa bazy z ktora chcemy sie polaczyc
  7.  
  8. if (isset($_POST['loguj']))
  9. {
  10. $link=@pg_connect("host=$host user=$login password=$haslo dbname=$dbname");
  11. if (!$link)
  12. {
  13. $_SESSION['komunikat'] = "Wprowadź poprawną nazwę użytkownika i hasło:";
  14. header("location:error.php");
  15. exit();
  16. }
  17. else
  18. {
  19. $_SESSION['zalogowany'] = $_POST['login'];
  20. header("location:chroniona.php");
  21. exit();
  22. }
  23. }
  24. ?>


formularz logowania: index.php
  1. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  2. <title>Logowanie do bazy</title>
  3. </head>
  4. <?php
  5. if(isSet($_SESSION['komunikat']))
  6. echo $_SESSION['komunikat'];
  7. else
  8. echo "Wprowadź nazwę użytkownika i hasło:";
  9. ?>
  10.  
  11. <form method="POST" action="login.php" >
  12. <b>Nazwa użytkownika:</b>
  13. <br>
  14. <input type="text" name="login"><br>
  15. <b>Hasło:</b><br>
  16. <input type="password" name="haslo"><br><br>
  17. <input type="submit" value="loguj" name="loguj">
  18. </form>
  19. </body>
  20. </html>


gdy uzytkownik i haslo sie zgadzaja: chroniona.php
  1. <?php
  2. session_start();
  3. if(!isSet($_SESSION['zalogowany']))
  4. {
  5. $_SESSION['komunikat'] = "Nie jestes zalogowany!";
  6. include('index.php');
  7. exit();
  8. }
  9. ?>
  10.  
  11. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  12. </head>
  13. Jesteś zalogowany jako: <?php echo $_SESSION['zalogowany'] ?><br>
  14. Tutaj mają dostęp tylko najlepsi!! biggrin.gif<br>
  15. <a href="logout.php">Wylogowanie</a>
  16. </body>
  17. </html>


strona wylogowania i zamkniecia sesji: logout.php
  1. <?php
  2. session_start();
  3. if(!isSet($_SESSION['zalogowany']))
  4. {
  5. $komunikat = "Nie byłeś zalogowany!";
  6. }
  7. else
  8. {
  9. unset($_SESSION['zalogowany']);
  10. $komunikat = "Wylogowanie prawidłowe!";
  11. }
  12. session_destroy();
  13. ?>
  14.  
  15. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  16. </head>
  17. <?php echo $komunikat ?>
  18. <p><a href="index.php">Powrót do strony glównej</a></p>
  19. </body>
  20. </html>


jezeli wprowadzisz zle - uzytkownika lub haslo: error.php
  1. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  2. <title>Zły login</title>
  3. </head>
  4. <body>
  5. <p>"Nieprawidłowa nazwa użytkownika lub hasło"</p>
  6. <p><a href="index.php">Powrót do strony głównej</a></p>
  7. </body>
  8. </html>


to na tyle - jezeli ktos ma jakies pytania to smialo pytac
pzdr
Jacek
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.