Tredun ohjelmistokehittäjien kurssimateriaaleja
Rekisteröitymisen yhteydessä tietokantaan (esim. users-taulu) lisätään kirjautumistiedot käyttäjästä (vähintään käyttäjänimi ja salasana).
Huomioi seuraavat asiat:
Salasanan salauksen voit tehdä näin:
$hashedpswrd = password_hash($password,PASSWORD_DEFAULT);
Kun käyttäjä kirjautuu järjestelmään, hän syöttää käyttäjänimen ja salasanan. Myös tässä pitäisi käyttää HTTPS-protokollaa.
Tietokannasta haetaan käyttäjän (hashed) salasana, jota voidaan verrata annettuun salasanaan näin:
$result = password_verify($given_password, $hashed_password);
PHP:ssä on valmiina toiminnallisuudet session hallintaan. PHP-palvelin muistaa, että käyttäjä on kirjautuneena käyttämällä evästeitä (session cookies). Eväste tallentuu selaimeen sekä palvelimelle, ja se liitetään automaattisesti jokaiseen HTTP-kyselyyn (request).
Istunto aloitetaan ensimmäisenä asiana palvelinpuolen koodia:
session_start();
Tämä alustaa superglobaalin istuntomuuttujataulukon $_SESSION[]. Tähän voidaan tallentaa istuntoon liittyviä tietoja.
Kirjautumisen yhteydessä voidaan tallentaa esim. kirjautuneen käyttäjän tiedot (esim. username) sekä istunnon tunniste (session_id):
$result = login($pdo, 'users', ["username" => $username, "password" => $password]);
if($result){
$_SESSION["username"] = $username;
$_SESSION["session_id"] = session_id();
header("Location: /"); // forward eli uudelleenohjaus
} else {
require "views/login.view.php";
}
Jos kirjautuminen onnistuu, uudelleenohjataan käyttäjä header-funktion avulla pääsivulle, muussa tapauksessa pysytään kirjautumisnäkymässä.
Näiden tietojen avulla voidaan tarkistaa onko kirjautuminen edelleen voimassa esim. tällaisen apufunktion avulla (tämä voi sijaita esim. “libraries/Helpers.php”-tiedostossa):
function isLoggedIn(){
if(isset($_SESSION['username']) && ($_SESSION['session_id'] == session_id())){
return true;
} else {
return false;
}
}
Nyt voidaan reititys ohjata toimimaan eritavalla kirjautuneelle ja ei-kirjautuneelle käyttäjälle:
if(isLoggedIn()){
require_once 'controllers/uusi_uutinen.php';
} else {
require_once 'controllers/login.php';
}
Samoin voidaan toteuttaa erilaisia näkymiä .view.:hin (poistaminen ja päivittäminen vain kirjautuneena):
if(isLoggedIn()){
$id = $newsitem['uutinenID'];
echo "<a href=/poista_uutinen/$id>Poista</a>". " ";
echo "<a href=/paivita_uutinen/$id>Päivitä</a>";
}
Samoin navigointipalkki voi muuttua:
<?php if(!isLoggedIn()): ?>
<li class="navbutton"><a href="/login">Login</a></li>
<li class="navbutton"><a href="/register">Rekisteröidy</a></li>
<?php else: ?>
<li class="navbutton"><a href="/uusi_uutinen">Uusi uutinen</a></li>
<li class="navbutton"><a href="/logout">Logout</a></li>
<?php endif ?>
Uloskirjautuessa poistetaan istunto sekä palvelimelta, että selaimesta:
session_unset(); //poistaa kaikki muuttujat
session_destroy();
setcookie(session_name(),'',0,'/'); //poistaa evästeen selaimesta
session_regenerate_id(true);
header("Location: /login"); // forward eli uudelleenohjaus
die();