Sähköisten asiointipalveluiden toteuttaminen

Sorakuilu

PHP demo 15, autentikointi istunnon avulla

Näyttökartta

näyttökartta

Hyvä kuvaus istunnon toiminnasta, Helsingin yliopiston materiaalia

Sekvenssikaavio

Piirrä kuvaava sekvenssikaavio, jossa näkyvät tiedostojen ja funktioiden nimet.

sekvenssikaavio

./views/loginform.view.php - GET-pyyntö

Aluksi ruudulle avataan lomake kirjautumista varten:

<?php
require "./views/partials/head.php";

if(isset(
$message)) echo $message;
?>

<form method="post">
<label for="account_name">Käyttäjätunnus</label><br>
<input type="text" name="account_name" required><br>

<label for="password">Salasana</label><br>
<input type="password" name="password" required><br>

<input type="submit" value="Kirjaudu"><br>
</form>

<?php
require "./views/partials/end.php";
?>

./controllers/postlogincontroller.php - POST-pyyntö

Kun käyttäjä on saanut lomakkeen ruudulle ja täyttänyt sen, hän klikkaa "kirjaudu", jolloin pyyntö ohjautuu postlogincontrollerille. Kun autentikoidaan istunnon avulla, tieto kirjautumisesta tallennetaan palvelimeen istuntomuuttujaan. Tässä tallennamme käyttäjän id:n ja ip:n.

<?php
require "./helpers/helper.php";
require 
"./database/models/Player.php";

if(isset(
$_POST["password"],$_POST["account_name"])) {
    
$account_name sanit($_POST["account_name"]);
    
$password sanit($_POST["password"]);

    
$ok loginPlayer($account_name,$password);
    if(
$ok) {
        
$player getPlayerByName($account_name);
        
$id $player[0]->id;
        
$ip $_SERVER["REMOTE_ADDR"];

        
$_SESSION["id"] = $id;
        
$_SESSION["ip"] = $ip;

        
$players getAllPlayers();
        require 
"./views/admin.view.php";
        
    } else {
        
$message ="Käyttäjän salasana ja käyttäjätunnus eivät vastaa toisiaan";
        require 
"./views/loginform.view.php";
    }
}
else 
{
    
$message ="Et lähettänyt tietoja!!";
    require 
"./views/loginform.view.php";
}

./database/models/Player.php funktio loginPlayer

Tietokantaa käsittelevään Player.php:hen lisätään funktio kirjautumisen tarkistamiseen (onko käyttäjä olemassa)

<?php
function loginPlayer($account_name,$password)
{
    global 
$pdo;   
    
$sql "SELECT id,account_name,password FROM players WHERE account_name = ?";

    
$stm $pdo->prepare($sql);
    
$stm->bindValue(1,$account_name);
    
$stm->execute();

    
$player $stm->fetchAll(PDO::FETCH_CLASS);
    
var_dump($player);
    echo 
$player[0]->password;
    if(
password_verify($password,$player[0]->password)) {
        return 
TRUE;
    }
    else return 
FALSE;
}
?>

./controllers/logoutcontroller.php

Uloskirjautuessa istunto tyhjennetään ja poistetaan.

<?php

require "./database/models/Player.php";
$players getAllPlayers();

if(isset(
$_SESSION["ip"],$_SESSION["id"]))
{
    
session_unset(); //poistaa kaikki muuttujat
    
session_destroy();
    require 
"./views/index.view.php";
}
else require 
"./views/index.view.php";
?>

./helpers/auth.php

Ja kun käyttäjä tekee pyynnön, jota varten tulee olla kirjautunut, tarkistetaan, että istunto on olemassa ja ip ovat samat kuin istuntomuuttujassa on tallessa.

<?php 
function isAuthenticated()
{
    if(isset(
$_SESSION["id"],$_SESSION["ip"]) && $_SESSION["ip"] == $_SERVER["REMOTE_ADDR"]) {
        return 
TRUE;
    }
    else return 
FALSE;
}
?>

Muut ohjelmakoodin muutokset

index.php - reitit kuntoon, lisätty autentikointi

<?php
session_start
();
//pyynnöt on muotoa index.php?action=edit&id=5
require "./helpers/auth.php";

if(isset(
$_GET["action"])) $action $_GET["action"];
else 
$action "index"//index on kotisivu
$method strtolower($_SERVER['REQUEST_METHOD']);

switch(
$action) {
    case 
"index":
    require 
"./controllers/indexcontroller.php";
    break;

    case 
"addplayer":
    if(
$method =="get") require "./views/addplayerform.view.php";
    else require 
"./controllers/postaddplayercontroller.php";
    break;

    case 
"login":
    if(
$method=="get") require "./views/loginform.view.php";
    else require 
"./controllers/postlogincontroller.php";
    break;

    case 
"logout":
    if(
isAuthenticated()) {
        require 
"./controllers/logoutcontroller.php";
    }
    else require 
"./controllers/indexcontroller.php";
    break;

    case 
"delete":
    if(
isAuthenticated()) {
        require 
"./controllers/deletecontroller.php";
    } else require 
"./views/loginform.view.php";
    break;

    case 
"edit":
    if(
isAuthenticated()) {
        if(
$method == "get") require "./controllers/geteditplayercontroller.php";
        else require 
"./controllers/posteditplayercontroller.php";
    } else require 
"./views/loginform.view.php";
    break;

    case 
"admin":
    if(
isAuthenticated()) {
        require 
"./controllers/admincontroller.php";
    } else require 
"./views/loginform.view.php";    
    break;


    default:
    echo 
"404";
 }

./database/models/Player.php

<?php
require "./database/connection.php";

function 
loginPlayer($account_name,$password)
{
    global 
$pdo;   
    
$sql "SELECT id,account_name,password FROM players WHERE account_name = ?";

    
$stm $pdo->prepare($sql);
    
$stm->bindValue(1,$account_name);
    
$stm->execute();

    
$player $stm->fetchAll(PDO::FETCH_CLASS);
    
var_dump($player);
    echo 
$player[0]->password;
    if(
password_verify($password,$player[0]->password)) {
        return 
TRUE;
    }
    else return 
FALSE;
}

function 
getAllPlayers()
{
    global 
$pdo;
    
$sql "SELECT id,account_name FROM players";
    
$stm $pdo->query($sql); 
    
    
$players $stm->fetchAll(PDO::FETCH_CLASS);
    return 
$players;
}

function 
addPlayer($data)
{
    global 
$pdo;
    
$sql "INSERT INTO players(account_name,password,email,last_login,online,money,current_character,banned) VALUES (?,?,?,?,?,?,?,?)";

    
$stm $pdo->prepare($sql);
    
$stm->execute($data);

    return 
$pdo->lastInsertId();
}

function 
deletePlayer($id)
{
    global 
$pdo;
    
$sql "DELETE FROM players WHERE id = ?";

    
$stm $pdo->prepare($sql);
    
$stm->bindValue(1$id);
    
$stm->execute();
}

function 
getPlayerById($id//hakee yhden pelaajan tiedot
{
    global 
$pdo;
    
$sql "SELECT * FROM players WHERE id = ?";

    
$stm $pdo->prepare($sql);
    
$stm->bindValue(1$id);
    
$stm->execute();

    
$player $stm->fetchAll(PDO::FETCH_CLASS);
    return 
$player;
}

function 
getPlayerByName($account_name)
{
    global 
$pdo;
    
$sql "SELECT * FROM players WHERE account_name = ?";

    
$stm $pdo->prepare($sql);
    
$stm->bindValue(1$account_name);
    
$stm->execute();

    
$player $stm->fetchAll(PDO::FETCH_CLASS);
    return 
$player;
}




function 
editPlayer($data)
{
    global 
$pdo;
    
$sql "UPDATE players SET account_name = ?, email = ?, money = ?,current_character = ?,banned = ? WHERE id = ?";

    
$stm $pdo->prepare($sql);
    return 
$stm->execute($data);    
}

./controllers/posteditplayercontroller.php

<?php
require "./database/models/Player.php";
require 
"./helpers/helper.php";


if(isset(
$_POST["id"],$_POST["aname"],$_POST["email"],$_POST["character"],$_POST["money"])) {
    
$id $_POST["id"];
    
$account_name sanit($_POST["aname"]);
    
$email sanit($_POST["email"]);
    
$current_character sanit($_POST["character"]);
    
$money $_POST["money"];
        
    if(isset(
$_POST["banned"])) $banned 1;
    else 
$banned 0;

    
$data = array($account_name,$email,$money,$current_character,$banned,$id);

    if(
editPlayer($data)) {
        
$players getAllPlayers();
        
$message "Tiedot muutettu";
        require 
"./views/admin.view.php";
    }
    else {
        
$players getAllPlayers();
        
$message ="Muutos ei onnistunut";
        require 
"./views/admin.view.php";
    }

}
else {
    
$players getAllPlayers();
    echo 
"Tietoja puuttuu";
    require 
"./views/admin.view.php";
}

./controllers/deletecontroller.php

<?php
require "./database/models/Player.php";
$players getAllPlayers();
  
if(isset(
$_GET["id"])) {
    
$id$_GET["id"];
    
deletePlayer($id);
    require 
"./views/admin.view.php";
}
else {
    
$message ="Poistaminen ei onnistu";
    require 
"./views/admin.view.php";   
}

./controllers/admincontroller.php

<?php
require "./database/models/Player.php";
$players getAllPlayers();
//var_dump($players);
require "./views/admin.view.php";
?>

./views/admin.view.php

<?php
include "/partials/adminhead.php";
if(isset(
$account_name,$_SESSION["id"])) echo "Kirjautuneena $account_name";
?>

<h1>Kaikki pelaajat</h1>

<?php foreach($players as $player) {
    
?>
    <h3><?= $player->account_name;?></h3>
    <a href="./index.php?action=edit&id=<?=$player->id;?>">Muokkaa</a><br>
    <a href="./index.php?action=delete&id=<?=$player->id;?>">Poista</a><br>
<?php
}

if(isset(
$message)) echo $message;

include 
"/partials/end.php";
?>


./views/partials/adminhead.php

<!doctype html>
<html lang="fi">
<head>
<meta charset ="utf-8">
<title>PDO demo 13</title>
</head>
<body>

<?php if(isset($_SESSION["id"],$_SESSION["ip"])) { ?>
    <a href="./index.php?action=logout">Kirjaudu ulos</a><br>
<?php }
?> 
<hr>

Ja aikaisemmin luodut tiedostot..

./database/connection.php

<?php
$dsn 
"mysql:host=magnesium;dbname=db13leena";
$user "leena";
$passwd "lmjn";

$pdo = new PDO($dsn$user$passwd);
?>

./controllers/geteditplayercontroller.php

<?php
require "./database/models/Player.php";

if(isset(
$_GET["id"])) {
    
$id $_GET["id"];
    
$player getPlayerById($id);
    require 
"./views/editplayerform.view.php";
}

./controllers/indexcontroller.php

<?php
require "./database/models/Player.php";
$players getAllPlayers();
//var_dump($players);
require "./views/index.view.php";
?>

./controllers/postaddplayercontroller.php

<?php
require "./helpers/helper.php";
require 
"./database/models/Player.php";

if(isset(
$_POST["aname"],$_POST["passwd"],$_POST["passwd2"],$_POST["email"],$_POST["character"]) && $_POST["passwd"] == $_POST["passwd2"]) {
    
$name sanit($_POST["aname"]);
    
$passu sanit($_POST["passwd"]);
    
$passu password_hash($passu,PASSWORD_DEFAULT);
    
$email sanit($_POST["email"]);
    
$character sanit($_POST["character"]);
    
$last_login date('Y-m-d');


    
//(account_name,password,email,last_login,online,money,current_character,banned)

    
$data = array($name,$passu,$email,$last_login,1,500,$character,0);
    
//var_dump($data);
    
$id addPlayer($data);
    
$message "Lisätty uusi pelaaja, id on $id";
    
//echo $id;
    
$players getAllPlayers();
    require 
"./views/index.view.php";
}
else {
    
$message "Tietoja puuttuu";
    require 
"./views/addplayerform.view.php";
}

./helpers/helper.php

<?php

function sanit($word)
{
    
$word trim($word);
    
$word filter_var($word,FILTER_SANITIZE_STRING);
    return 
$word;
}

?>

./views/index.view.php

<?php
include "/partials/head.php";
if(isset(
$account_name,$_SESSION["id"])) echo "Kirjautuneena $account_name";
?>

<h1>Kaikki pelaajat</h1>
<p>
<?php foreach($players as $player) {
    
?>
    <h3><?= $player->account_name;?></h3>
<?php
}

if(isset(
$message)) echo $message;

include 
"/partials/end.php";
?>


./views/addplayerform.view.php

<?php
include "/partials/head.php";

if(isset(
$message)) echo $message;?>

<form method="post">
<label for="aname">Käyttäjätunnus</label><br>
<input type="text" name="aname" required><br>

<label for="passwd">Salasana</label><br>
<input type="password" name="passwd" required><br>

<label for="passwd2">Salasana uudestaan</label><br>
<input type="password" name="passwd2" required><br>

<label for="email">Sähköposti</label><br>
<input type="email" name="email" required><br>

<label for="character">Hahmo</label>
<select name="character" required>
    <option value="hirviö">hirviö</option>
    <option value="olio">olio</option>
    <option value="keiju">keiju</option>
</select>
<br>
<input type="submit" value="Lisää pelaaja">
</form>

<?php
include "/partials/end.php";
?>

./views/editplayerform.view.php

<?php
include "/partials/adminhead.php";
//var_dump($player);

if(isset($message)) echo $message;?>

<form method="post">
<label for="aname">Käyttäjätunnus</label><br>
<input type="text" name="aname" value= "<?= $player[0]->account_name;?>" required><br>

<input type="hidden" name="id" value="<?= $player[0]->id;?>">

<!--
<label for="passwd">Salasana</label><br>
<input type="password" name="passwd" required><br>

<label for="passwd2">Salasana uudestaan</label><br>
<input type="password" name="passwd2" required><br>-->

<label for="email">Sähköposti</label><br>
<input type="email" name="email" value ="<?= $player[0]->email;?>" required><br>

<label for="money">Rahaa</label><br>
<input type="number" name="money" value ="<?= $player[0]->money;?>" required><br>

<label for="character">Hahmo</label>
<select name="character" required>
    <option value="hirviö" <?php if($player[0]->current_character == "hirviö") echo "selected";?>>hirviö</option>
    <option value="olio" <?php if($player[0]->current_character == "olio") echo "selected";?>>olio</option>
    <option value="keiju" <?php if($player[0]->current_character == "keiju") echo "selected";?>>keiju</option>
</select>
<br>
<label for="banned">Bannattu</label>
<input type ="checkbox" <?php if($player[0]->banned == 0) echo "value=\"0\"";
else echo 
"value=\"1\" checked";?>><br>

<input type="submit" value="Muuta pelaajaa">
</form>

<?php
include "/partials/end.php";
?>

./views/partials/head.php

<!doctype html>
<html lang="fi">
<head>
<meta charset ="utf-8">
<title>PDO demo 13</title>
</head>
<body>
<a href="./index.php?action=addplayer">Lisää pelaaja</a><br>
<?php if(isset($_SESSION["id"],$_SESSION["ip"])) { ?>
    <a href="./index.php?action=logout">Kirjaudu ulos</a><br>
<?php }
else {
?>
    <a href="./index.php?action=login">Kirjaudu</a><br>
<hr>
<?php
}
?>

./views/partials/end.php

</body>
</html>