Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Uprawnienia po zalogowaniu
Forum PHP.pl > Forum > PHP
bar_kow
Witam, męczę się jakiś czas. Może Wy mi pomożecie.
Mam prosty system logowania. Chciałbym do niego dodać odpowiednie uprawnienia. W MySQL dodałem kolumnę uprawnienia, gdzie domyślna wartość to "zwykle".
Jak zrobić aby po zalogowaniu, oprócz nazwy użytkownika pobierał też uprawnienia?

Plik logowania:
  1.  
  2. $message="";
  3.  
  4. // Sekcja logowania
  5. $login=$_POST['login'];
  6. if($login) {
  7.  
  8. $uzytkownik=$_POST['uzytkownik'];
  9. $md5_haslo=md5($_POST['haslo']);
  10.  
  11.  
  12.  
  13. $host="localhost";
  14. $db_user="UZYTKOWNIK";
  15. $db_password="HASLO";
  16. $database="NAZWA";
  17. mysql_connect($host,$db_user,$db_password);
  18. mysql_select_db($database);
  19.  
  20. $rezultat=mysql_query("select * FROM logowanie WHERE uzytkownik='$uzytkownik' AND haslo='$md5_haslo'");
  21. if(@mysql_num_rows($rezultat)){
  22. session_register("uzytkownik");
  23.  
  24. header("location:main.php");
  25. }else {
  26. $message="<center><p algin='center'><div class='warning_box'>
  27. Nieprawid?owa nazwa u?ytkownika lub has?o!.
  28. </div></p></center>";
  29. }
  30. }
  31. ?>
  32.  
  33. STRONA


Plik strony (sesja):
  1. <?
  2.  
  3. if(!session_is_registered("uzytkownik")){
  4. header("location:index.php");
  5. }
  6. ?>
  7.  
  8. STRONA


Proszę o pomoc...

Edit:

Pobieranie nazwy użytkownika np.:
  1. Witaj, <? echo $_SESSION['uzytkownik']; ?>.


Myślałem o tym $_SESSION['uprawnienia'] ale nie działa...;
szmerak
Po pierwsze to zabezpiecz te $_POSTy... Twój skrypt jest podatny na SQL INJECTION
a uprawnienia... w SELECie masz gwiazdke, więc pobiera wszystkie kolumny... tak więc co to za problem w indexie tablicy odwolac sie do tej kolumny?
i przypisac ja do zmiennej session

$result[nazwa_kolumny]
modern-web
Dodatkowo filtruj dane; ogranicz długość ciągu wprowadzanego do programu oraz zdefiniuj odpowiedni typ zmiennej (np. jeżeli ma być to liczbą to "(int) $zmienna = 1"). Odnośnie SQL Injection - skorzystaj z mysql_real_escape_string. I tak na przyszłość, odradzam korzystania z MySQL. Poczytaj trochę o MySQLi oraz PDO. Nie dość, że szybsze to jeszcze oferują lepszą obsługę błędów smile.gif
bar_kow
Coś takiego w pliku strony dać?
$_SESSION['uprawnienia'] = $result[uprawnienia]
?
modern-web
W pliku logowania musisz przekazać wartości do sesji - tutaj robisz $_SESSION['uprawnienia'] = $result['uprawnienia'].
Następnie w pliku strony musisz sprawdzić, czy sesja o nazwie 'uprawnienia' istnieje, a potem możesz sobie to przypisać do jakiejś zmiennej ale możesz też operować na zmiennej sesji smile.gif
bar_kow
Coś mi dziś nie wychodzi... jakiegoś doła mam. Nawet nie wiem gdzie to wstawić aby działało sad.gif
szmerak
Masz pliki... logowanie.php <- odpowiedzialny za sprawdzenie czy uzytkownik podał prawidłowe dane...
i index.php <- gdy użytkownik jest zalogowany ma dostęp do np. ukrytego menu...

W każdym pliku zaczynasz sesje
session_start();

Następnie w pliku logowanie po zwalidowaniu wszystkiego ustawiasz zmienne sesyjne.

$_SESSION['is_user_logged'] = TRUE;
+
$_SESSION['user_name'] = $result[username];
+
$_SESSION['rights'] = $result[rights];

i przekierowywujesz użytkownika na stronę index.php funkcją header();

W pliku index.php musisz sprawdzić czy użytkownik jest zalogowany..
np.
session_start();
<html>
<body>
//treść dostępna dla wszystkich

i tutaj sprawdzasz czy uzytkownik jest zalogowany
if($_SESSION['is_user_logged'] == TRUE) {
//treść tylko dla zalogowanych
Twoja nazwa użytkownika to: $_SESSION['user_name'];
Twoje uprawnienia to: $_SESSION['rights'];
}

//treść dostępna dla wszystkich
</html>

i w taki sposób możesz wszędzie sprawdzać czy użytkownik jest zalogowany...
if($_SESSION['is_user_logged'] == true)
{ tutaj dla zalogowanych }

Równierz wszystkie akcje dodawania/usuwania/edytowania możesz kontrować właśnie w taki sposób dając tylko dostęp zalogowanym użytkownikom...

Aby się wylogować używasz później funkcji session_destroy();
modern-web
LOGOWANIE:
  1. <?php
  2. $login = mysql_real_escape_string(trim($_POST['login']));
  3. if($login) {
  4. $uzytkownik = $_POST['uzytkownik'];
  5. $md5_haslo = md5(mysql_real_escape_string(trim($_POST['haslo'])));
  6.  
  7. $host="localhost";
  8. $db_user="UZYTKOWNIK";
  9. $db_password="HASLO";
  10. $database="NAZWA";
  11.  
  12. mysql_connect($host, $db_user, $db_password);
  13. mysql_select_db($database);
  14.  
  15. $rezultat = mysql_query("SELECT * FROM `logowanie` WHERE `uzytkownik` = '$uzytkownik' AND `haslo` = '$md5_haslo'");
  16. if (mysql_num_rows($rezultat)) {
  17. $_SESSION['uzytkownik'] = $rezultat['uzytkownik'];
  18. $_SESSION['uprawnienia'] = $rezultat['uprawnienia'];
  19. header("location:main.php");
  20. } else {
  21. $message="<center><p algin='center'><div class='warning_box'>Nieprawid?owa nazwa u?ytkownika lub has?o!.</div></p></center>";
  22. }
  23. }
  24. ?>


STRONA:
  1. <?php
  2. if ( isset($_SESSION['uzytkownik']) && isset($_SESSION['uprawnienia']) ) {
  3. echo 'ok';
  4. } else {
  5. header("location:index.php");
  6. }
  7. ?>


Spróbuj teraz smile.gif

Edit - @szmerak
Ja radziłbym wcześniej wyczyścić zawartość tablicy sesyjnej smile.gif $_SESSION = array();
szmerak
  1. $start_user_sess = $_SESSION['uzytkownik'] = $rezultat('uzytkownik');
  2. $start_user_priv = $_SESSION['uprawnienia'] = $rezultat('uprawnienia');

sorki ale nie wiem po co to skoro przekierowywujesz użytkownika na main.php
a po drugie dałeś nawiasy zwykłe zamiast kwadratowych

@EDIT
@up jak najbardziej zgadzam się z tym smile.gif. Ja mam do tego specjalne funkcje które są dołączane na początku każdego pliku smile.gif
bar_kow
W pliku logowania wywala błąd w linii 3
modern-web
Faktycznie szmerak! Dzięki za czujność smile.gif Z pośpiechu popełniłem tak radykalny błąd.
Przypisałem te operacje do zmiennych z jednego powodu - żeby wiedział co się w tym momencie odbywa bo widzę, że facet jest ciemny w temacie sesje wink.gif

Treść błędu poproszę.
szmerak
Mysql_real_escape_string możesz użyć dopiero po połączeniu się z bazą!

Przenieś to
  1. $host="localhost";
  2. $db_user="UZYTKOWNIK";
  3. $db_password="HASLO";
  4. $database="NAZWA";
  5.  
  6. mysql_connect($host, $db_user, $db_password);
  7. mysql_select_db($database);


Na samą górę pliku
bar_kow
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'coś'@'localhost' (using password: NO) in /home/xxxx/domains/xxxxx.eu/public_html/xxxxx/index.php on line 3

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /home/xxx/domains/xxxx.eu/public_html/xxxxx/index.php on line 3
modern-web
Najlepiej wywal poza katalog publiczny strony gdzieś katalog wyżej i użyj require do zaimportowania.
Mayka
No bo to że musisz wpisać swoje dane do logowania do sql'a to oczywiście wiesz wink.gif
szmerak
Zrób tak weź utwórz osobny plik connect.php daj tam funkcję łączące się z bazą
a tam gdzie potrzebujesz łączyć się z bazą daj require './connect.php'; na samej górze

gotowca chyba nie musze ci dawać?

tak btw... taką masz nazwę użytkownika? Access denied for user 'coś'@'localhost'

"coś"?
modern-web
A skąd pewność, że nie jest to subdomena ;>? W tym wypadku pozostaje luka bezpieczeństwa przez domenę. Lepiej żeby wywalił ten katalog/plik ZUPEŁNIE poza public_html (w przypadku XAMPPA - poza htdocs)

@ nie używa się polskich znaków w programowaniu - wbij to sobie do głowy smile.gif
bar_kow
Mayka, wiem wiem
Wywalił błąd w linii 23, poprawiłem nawiasy z ( ) na [ ] błąd zniknął. Teraz mam błąd w pliku strony
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at

Linia 4:
session_start();

Warning: Cannot modify header information - headers already sent by (output started at /ho

Linia 8:
header("location:index.php");
modern-web
dodaj

ob_start();

w 2 linijce kodu (pod session_start()wink.gif i

ob_end_flush();

na końcu pliku
szmerak
To znaczy że nagłówki zostały już wysłane...
Musisz wykonać te funkcje przed wyświetleniem czegokolwiek!
bar_kow
Jak zrobiłem tak:
  1. <?php
  2.  
  3.  
  4. if ( isset($_SESSION['uzytkownik']) && isset($_SESSION['uprawnienia']) ) {
  5. echo 'ok';
  6. } else {
  7. header("location:index.php");
  8. }
  9. ?>

STRONA
  1. </div>
  2. <?PHP
  3. require('stopka.php');
  4. ?>


To wywala błędy w liniach:
4:
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent

oraz 11
Warning: Cannot modify header information - headers already sent by (output started at
czyli w lini 11 jest header("location:index.php");
modern-web
Odpowiem tak; nie chce mi się tego wszystkiego tłumaczyć jak wątek ten był poruszany 1000 razy.
Rzuć okiem tutaj -> http://forum.ovh.pl/showthread.php?t=7960
i tutaj -> http://pl.wikibooks.org/wiki/PHP/Sesje
oraz tutaj -> header
szmerak
Przed znakiem <? masz spacje... A tam jej nie może być ponieważ ta spacja jest wyświetlana przed startem sesji.
Pamiętaj że te funkcje muszą być wywołane przed wysłaniem nagłówków...

Usuń spacje i powinno działać
bar_kow
Teraz nawet nie chce zalogować...
Ok wrócę do tego za tydzień, bo jutro wyjeżdżam na tygodniową konferencję po za Polskę...
modern-web
Język PHP pomija przecież spacje ;|, a na dodatek mówisz tu o spacjach, które wykraczają poza obszar skryptu...
szmerak
Ale przecież to co nie jest w znacznikach <?php?> jest wyświetlane jako HTML? right?

Tak więc to był problem ponieważ HTML(tutaj spacje) zostały wyświetlone przed wykonaniem kodu php

Nie potrzebnie to ciągniemy bar_kow daj kod źródłowy... Zobacze czy jestem wstanie ci pomóc
bar_kow
Plik index.php
  1. <?php
  2.  
  3.  
  4. $host="localhost"; // Nazwa hosta.
  5. $db_user="nazwa_1"; // Nazwa użytkownika - MySQL.
  6. $db_password="haslo"; // Hasło do bazy.
  7. $database="tabela"; // Nazwa bazy.
  8. mysql_connect($host,$db_user,$db_password);
  9. mysql_select_db($database);
  10. $login = mysql_real_escape_string(trim($_POST['login']));
  11. if($login) {
  12. $uzytkownik = $_POST['uzytkownik'];
  13. $md5_haslo = md5(mysql_real_escape_string(trim($_POST['haslo'])));
  14.  
  15.  
  16. // Połączenie z bazą.
  17.  
  18.  
  19.  
  20.  
  21.  
  22. $rezultat = mysql_query("SELECT * FROM logowanie WHERE uzytkownik = '$uzytkownik' AND haslo = '$md5_haslo'");
  23. if (mysql_num_rows($rezultat)) {
  24. $start_user_sess = $_SESSION['uzytkownik'] = $rezultat['uzytkownik'];
  25. $start_user_priv = $_SESSION['uprawnienia'] = $rezultat['uprawnienia'];
  26. header("location:main.php");
  27. } else {
  28. $message="<center><p algin='center'><div class='warning_box'>Nieprawid?owa nazwa u?ytkownika lub has?o!.</div></p></center>";
  29. }
  30. }
  31. ?>
  32.  
  33.  
  34.  
  35.  
  36.  
  37. <!-- PAGE --!>
  38.  
  39.  
  40. <?PHP
  41. require('gora.php');
  42. ?>
  43.  
  44.  
  45. <div id="templatemo_main_top"></div>
  46. <div id="templatemo_main"><span id="main_top"></span><span id="main_bottom"></span>
  47.  
  48. <?PHP
  49. require('bok.php');
  50. ?>
  51. <?PHP
  52. require('../info.php');
  53. ?>
  54.  
  55.  
  56.  
  57. <div class="cleaner"></div>
  58. </div> <!-- end of sidebar -->
  59.  
  60. <div id="templatemo_content">
  61.  
  62. <div class="content_box">
  63. <h2>Logowanie</h2>
  64.  
  65. </div>
  66. <div class="content_box">
  67.  
  68.  
  69.  
  70. <form id="form1" name="form1" method="post" action="<? echo $PHP_SELF; ?>">
  71.  
  72.  
  73. Username:<br>
  74. <input type="text" name="uzytkownik" id="uzytkownik" size="35" /><br>
  75. Password:<br>
  76. <input type="password" name="haslo" id="haslo" size="35" /><br>
  77.  
  78. <input type="submit" name="login" id="login" value="Enter" />
  79.  
  80.  
  81. </form>
  82.  
  83. <div class="cleaner"></div>
  84.  
  85. </div>
  86.  
  87. </div>
  88.  
  89. <div class="cleaner"></div>
  90. </div>
  91.  
  92. <div id="templatemo_main_bottom">
  93. </div>
  94.  
  95. </div> <!-- end of wrapper -->
  96. </div>
  97. <?PHP
  98. require('stopka.php');
  99.  
  100. ?>


Plik main.php

  1. <?php
  2.  
  3.  
  4. if ( isset($_SESSION['uzytkownik']) && isset($_SESSION['uprawnienia']) ) {
  5. echo 'ok';
  6. } else {
  7. header("location:index.php");
  8. }
  9. ?>
  10.  
  11.  
  12. <!-- PAGE --!>
  13.  
  14.  
  15. <?PHP
  16. require('goraz.php');
  17. ?>
  18.  
  19.  
  20. <div id="templatemo_main_top"></div>
  21. <div id="templatemo_main"><span id="main_top"></span><span id="main_bottom"></span>
  22.  
  23. <?PHP
  24. require('bokz.php');
  25. ?>
  26. <?PHP
  27. require('../info.php');
  28. ?>
  29.  
  30.  
  31.  
  32. <div class="cleaner"></div>
  33. </div> <!-- end of sidebar -->
  34.  
  35. <div id="templatemo_content">
  36.  
  37. <div class="content_box">
  38. <h2>Witaj <? echo $_SESSION['uzytkownik']; ?> | Uprawnienia: <? echo $_SESSION['uprawnienia']; ?> </h2>
  39.  
  40. </div>
  41. <div class="content_box">
  42. Aby kontynuować, wybierz odpowiednią pozycję w menu.
  43. <div class="cleaner"></div>
  44.  
  45. </div>
  46.  
  47. </div>
  48.  
  49. <div class="cleaner"></div>
  50. </div>
  51.  
  52. <div id="templatemo_main_bottom">
  53. </div>
  54.  
  55. </div> <!-- end of wrapper -->
  56. </div>
  57. <?PHP
  58. require('stopka.php');
  59.  
  60. ?>
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  


Juz tak namieszałem że sam już nic nie rozumiem, a głowa pi pęka przez stres... makabra
szmerak
Masz tutaj pliki.
index.php http://wklej.to/KyhwW
main.php http://wklej.to/TCbYN
connect.php http://wklej.to/ay9l5
zrobiłem na świeżo... niesprawdzałem

Używasz jakiegoś notepada? do pisania kodu?
bo masz straszny bałagan tam!

Dam ci jedną rade gdy robisz instrukcję if, funkcje, pętle ogólnie wszystko co otwiera i zamyka blok { }
Staraj się robić wcięcia tabulatur w środku... bardzo poprawia to czytelność kodu

i ogólnie zablokuj możliwość wejścia na formularz logowania jeśli ktoś jest zalogowany (zapomniało mi się)

daj na górze if($_SESSION['auth'] == TRUE) die("Wyloguj sie pierwsze");

Jeszcze jedno jak pewnie zauważyłeś użyłem ukrytego pola <input type="hidden" name="sent">
Jest to dobry sposób na sprawdzanie czy formularz został wysłany
bar_kow
Wielkie dzięki!
Tak, używam PSPad'a
Jednak nie pokazuje uprawnień sad.gif tylko nazwę użytkownika sad.gif
szmerak
EDIT!
Omg jak ja mogłem tego nie zauważyć... Tam jest tylko zapytanie nie ma użytej funkcji mysql_fetch_array();
bar_kow
$rezultat = mysql_query("SELECT uzytkownik, uprawnienia FROM logowanie WHERE uzytkownik = '$uzytkownik' AND haslo = '$md5_haslo'");

nadal nie pokazuje uprawnień...
<h2>Witaj <? echo $_SESSION['uzytkownik']; ?> | Uprawnienia: <? echo $_SESSION['uprawnienia']; ?> </h2>

Pokazuje TYLKO nazwę użytkownika
szmerak
To:
  1. $_SESSION['uzytkownik'] = $rezultat['uzytkownik'];
  2. $_SESSION['uprawnienia'] = $rezultat['uprawnienia'];
  3. $_SESSION['auth'] = TRUE;


zamień na:
  1. $dane = mysql_fetch_array($rezultat);
  2. $_SESSION['uzytkownik'] = $dane['uzytkownik'];
  3. $_SESSION['uprawnienia'] = $dane['uprawnienia'];
  4. $_SESSION['auth'] = TRUE;


Sorki mój błąd nie zauważyłem że tam jest tylko zapytanie mysql_query();
bar_kow
Działa! Dziękuję bardzo!!!
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-2025 Invision Power Services, Inc.