AMVA50,php ja mysql

7.1 Käyttäjä-taulu

7.2 Kirjautumissivut 

7.3 Kirjautumissivulle siirtyminen

7. KÄYTTÄJIEN HALLINTA

 

7.1 Käyttäjä-taulu

Jos käyttäjiä on useita ja varsinkin, jos heillä on eri tasoisia oikeuksia, kannattaa käyttäjien hallinta tehdä tietokantapohjaisesti.

Tässä luvussa esitetään edellisen esimerkin ylläpito-sivujen suojaus siten, että käyttäjä-tietoja ylläpidetään tietokannassa kayttaja-taulussa.  Käyttäjien lisääminen ja päivitys tehdään suoraan tietokantaan, eikä sitä varten tehdä sovellukseen www-sivuja. Esimerkkiä voisi laajentaa tältä osin tekemällä esimerkiksi rekisteröitymissivun.

Luodaan kayttaja-taulu tietokantaan seuraavalla sql-lauseella:

create table kayttaja(
tunnus varchar(30) primary key,
salasana varchar(32),
istuntotunnus varchar(32),
istunto_alkoi timestamp);

Selityksiä koodiin:

  • Salasana ja istuntotunnus tallennetaan MD5-algoritmilla salattuna. MD5 tuottaa tuloksenaan 128-bittisen tiivisteen, joka  tallennetaan tietokantaan 32-merkkisenä heksadesimaali muotona.
  • Istuntotunnus on jokaisen kirjautumisen yhteydessä muodostettava yksilöllinen istuntotunnus.

Tauluun lisätään käyttäjiä insert-lauseella. Lisätään esimerkkikäyttäjä testaaja, jonka salasana on testi. Salasana koodataan MD5-algoritmilla.

insert into kayttaja (tunnus, salasana) values ('testaaja', md5('testi'));

sivun alkuun

7.2 Kirjautumissivut

Tehdään yllapito-hakemistoon yksinkertainen lomake kirjautumislomake.php.

<h2>Anna tunnus ja salasana</h2> 
<form method="post" action="kirjautuminen.php"> Tunnus: <input type="text" name="tunnus" size="20" maxlength="20"><br> Salasana: <input type="password" name="salasana" size="20" maxlength="20"><br> <input type="submit" name='kirjaudu" value="Kirjaudu"> </form>

Kirjautumistiedot lähetetään tiedoston kirjautuminen.php käsiteltäväksi. Sen koodi on kommentoituna seuraavassa.

<?php 
require "../funktiot.php"; //Sijoitetaan lomakkeelle kirjoitetut tiedot muuttujiin $tunnus= $_POST['tunnus']; $salasana= $_POST['salasana'];
//tarkistetaan, ettei tunnus- tai salasana-kenttä ole tyhjä if ($tunnus == "" || $salasana == "") { header("Location: kirjautumislomake.php"); //palataan lomakkeelle exit; //lopetetaan koodin suoritus }
$yhteys = AvaaTietokanta();
// muodostetaan merkkijono ja luodaan uusi istuntotunnus $avain = time() . $tunnus . $salasana . getenv("REMOTE_ADDR"); //salataan istuntotunnus ja käyttäjätunnus $istuntotunnus = md5($avain); $tunnus = md5($tunnus);
//tallennetaan istuntotunnus tietokantaan, jos tunnus ja salasana ovat oikein $sql_lause= "update kayttaja set istuntotunnus='$istuntotunnus' where md5(tunnus)='$tunnus' and salasana='".md5($salasana)."'";
if (!$kysely = mysql_query($sql_lause))
{ header("Location: kirjautumislomake.php"); //jos kysely epäonnistui
exit;
} else
{ //jos päivitettyjen rivien määrä on yksi, niin asetetaan istuntotunnus-eväste
//ja siirrytään ylläpidon pääsivulle
if (mysql_affected_rows($yhteys) == 1)
{ setcookie("istuntotunnus","$istuntotunnus",0,"/");
header("Location: kaikki.php");
exit; } header("Location: kirjautumislomake.php");
} ?>

sivun alkuun

7.3 Kirjautumissivulle siirtyminen

Ylläpitosivuille pitää lisätä tarkistus, joka tarkistaa, että käyttäjä on kirjautunut järjestelmään. Mikäli kirjautumista ei ole tehty onnistuneesti, siirrytään automaattisesti kirjautumislomakkeelle.

Tehdään yllapito-hakemistoon tiedosto aputoiminnot.php, joka lisätään jokaisen ylläpito-sivun alkuun kirjautumisen tarkistamista varten.

<?php 
//liitetään mukaan funktiot.php-tiedosto ylemmästä hakemistosta
require "../funktiot.php"; 
$yhteys = AvaaTietokanta(); 
//tutkitaan onko eväste nimeltä istuntotunnus asetettu $istuntotunnus=$_COOKIE['istuntotunnus'];
if ($istuntotunnus=="")
{ $istuntotunnus="tyhja";
} //tutkitaan löytyykö istuntotunniste-evästeen arvo käyttäjä-taulusta $sql_lause= "select tunnus,istuntotunnus from kayttaja where istuntotunnus='$istuntotunnus'";
if (!$kysely = mysql_query(sql_lause)) { //jos ei löydy, palataan kirjautumiseen
header("Location: kirjautumislomake.php");
exit; }

//tutkitaan montako tietuetta löytyi. Jos määrä on eri kuin yksi, niin
//palataan kirjautumissivulle, muuten kirjautuminen on tehty
if (mysql_num_rows($kysely)!= 1) { header("Location: kirjautumislomake.php");
exit; } ?>

Aputoiminnot-tiedosto tulee liittää jokaisen ylläpito-sivun alkuun. Liitetään se esimerkkinä ylläpidon aloitussivun eli kaikki.php-sivun alkuun.

<?php require "aputoiminnot.php"; ?>

Koodi pitää olla sivulla ihan ensimmäisenä ennen html-elementtejä, koska se sisältää http-pyynnön otsaketietoina lähetettäviä tietoja. Huomioi myös, että aputoiminnot-php-tiedostossa on rivit:

  • require "../funktiot.php";  ja
  • $yhteys = AvaaTietokanta();
     

Nämä rivit tulee poistaa alkuperäistä kaikki.php-sivulta, jotta ne eivät tule kahteen kertaan.

Vastaavat muutokset tulee tehdä kaikille ylläpidon käyttämille sivuille.

sivun alkuun