Identity toepassen
Home

Identity toepassen

Identity toepassen

In deze les leer je hoe je Identity klasse gebruikt.

Stappenplan

  1. Zet de volgende klassen klaar:
    1. Kopiëer het bestand met de naam Indentity.php en plaats het in de map vendor/threepenny.
    2. Kopiëer het bestand met de naam CRUD.php en plaats het in de map vendor/threepenny.
  2. Maak een map met de naam data. Zorg ervoor dat die niet toegankelijk voor de webserver. Zet die 1 hoger dan de map waarin de website staat. In ons voorbeeld staat de website in de map public_html.
    1. SQLite
      1. De PHP code om de tabellen in een SQLite database te maken
        Plaats die volgende code in de map data/SQLite-dll-identity.php:
        <?php
        // echo phpinfo();
        $db = new SQLite3('babeluttes.db');
        
        $person = <<<EOT
        DROP TABLE IF EXISTS `Person`;
        CREATE TABLE Person (
            FirstName NVARCHAR (50) NOT NULL,
            LastName NVARCHAR (120) NOT NULL,
            ShortName NVARCHAR(15) NOT NULL,
            Address NVARCHAR (255) NULL,
            PostalCode VARCHAR (20) NULL,
            City NVARCHAR (80) NULL,
            Country NVARCHAR (80) NULL,
            Email NVARCHAR (255) NULL,
            Organisation NVARCHAR(255),
            Gender CHAR (1) NULL,
            Phone1 VARCHAR (25) NULL,
            Phone2 VARCHAR (25) NULL,
            Id INTEGER PRIMARY KEY AUTOINCREMENT);
        EOT;
        
        if($db->exec($person)) {
            echo "Table Person is successfully created.";
        }
        else{
            echo "Table Person is not created.";
        }
        
        $user = <<<EOT
        DROP TABLE IF EXISTS `User`;
        CREATE TABLE `User` (
            `Name` NVARCHAR (50) NOT NULL UNIQUE,
            `HashedPassword` NVARCHAR (255) NULL,
            `PersonId` INT NULL,
            `Role` NVARCHAR (30) NULL,
            `Id` INTEGER PRIMARY KEY AUTOINCREMENT,
            FOREIGN KEY (`PersonId`) REFERENCES `Person` (`Id`));
        EOT;
        
        if($db->exec($user)) {
            echo "Table User is successfully created.";
        }
        else{
            echo "Table User is not created.";
        }
      2. SQLite installeren op Ubuntu (verander eventueel het versienummer van PHP):
        sudo apt-get install php7.3-sqlite
        sudo service apache2 restart
      3. Start de webserver in de map /data, ga naar de data map en kies een vrije poort. In het voorbeeld gebruiken we poortnummer 63343.
        php -S localhost:63343
      4. Laad de pagina in de webrowser:
        http://localhost:63343/SQLite-dll-identity.php
      5. Als alles goed verloopt krijg je de melding dat de tabellen gemaakt zijn.
    2. Voor MySQL kan je de dll uitvoeren in bv. Workbench
      Plaats de dll sql in het bestand data/MySQL-dll-identity.sql:
      -- An Orm Apart -- Saturday 20th of June 2020 08:02:47 AM
      --
      SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
      -- mode changes syntax and behavior to conform more closely to standard CRUD.
      -- It is one of the special combination modes listed at the end of this section.
      SET GLOBAL sql_mode = 'ANSI';
      -- If database does not exist, create the database
      CREATE DATABASE IF NOT EXISTS StemEffect33;
      USE `StemEffect33`;
      -- With the MyCRUD FOREIGN_KEY_CHECKS variable,
      -- you don't have to worry about the order of your
      -- DROP and CREATE TABLE statements at all, and you can
      -- write them in any order you like, even the exact opposite.
      SET FOREIGN_KEY_CHECKS = 0;
      
      -- threepenny.be
      -- created by an orm apart
      -- Entreprise de modes et de manières modernes
      -- MySql: CREATE TABLE Person
      -- Created on Saturday 20th of June 2020 08:02:47 AM
      --
      DROP TABLE IF EXISTS `Person`;
      CREATE TABLE `Person` (
          `FirstName` NVARCHAR (50) NOT NULL,
          `LastName` NVARCHAR (120) NOT NULL,
          `Address` NVARCHAR (255) NULL,
          `PostalCode` VARCHAR (20) NULL,
          `City` NVARCHAR (80) NULL,
          `Country` NVARCHAR (80) NULL,
          `Email` NVARCHAR (255) NULL,
          `Gender` CHAR (1) NULL,
          `Phone1` VARCHAR (25) NULL,
          `Phone2` VARCHAR (25) NULL,
          `Id` INT NOT NULL AUTO_INCREMENT,
          CONSTRAINT PRIMARY KEY(`Id`));
      
      DROP TABLE IF EXISTS `User`;
      CREATE TABLE `User` (
          `Name` NVARCHAR (50) NOT NULL,
          `HashedPassword` NVARCHAR (255) NULL,
          `PersonId` INT NULL,
          `Role` NVARCHAR (30) NULL,
          `Id` INT NOT NULL AUTO_INCREMENT,
          CONSTRAINT PRIMARY KEY(`Id`),
          CONSTRAINT uc_User_Name UNIQUE (Name),
          CONSTRAINT fk_UserPersonId FOREIGN KEY (`PersonId`) REFERENCES `Person` (`Id`));
      
      -- With the MyCRUD FOREIGN_KEY_CHECKS variable,
      -- you don't have to worry about the order of your
      -- DROP and CREATE TABLE statements at all, and you can
      -- write them in any order you like, even the exact opposite.
      SET FOREIGN_KEY_CHECKS = 1;
  3. Maak een map met de naam config. Zorg ervoor dat die niet toegankelijk voor de webserver. Zet die 1 hoger dan de map waarin de website staat. In ons voorbeeld staat de website in de map public_html.
    1. Maak daarin een bestand met dezelfde naam als de domeinnaam van website. Bijvoorbeeld: vrouwencentrum.modernways.be.php.
    2. Parameters voor PDO:
      define('DB_OPTIONS', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    3. Parameters voor SQLite:
      define('DB_USER', '');
      define('DB_PASSWORD', '');
      define('DB_NAME', '../data/babeluttes.db');
      define('DB_DRIVER', 'sqlite');
      define('DSN', DB_DRIVER . ':' . DB_NAME);
    4. Parameters voor MySQL:
      define('DB_HOST', '51.38.37.xxx');
      define('DB_USER', 'xxx');
      define('DB_PASSWORD', 'xxx');
      define('DB_NAME', 'StemEffect33');
      define('DB_DRIVER', 'mysql');
      define('DB_PORT', '3306');
      define('DSN', DB_DRIVER . ':host=' . DB_HOST . ':' . DB_PORT . ';dbname=' . DB_NAME);
  4. PHP code om personen en gebruikers toe te voegen
    1. In de data map, maak je een bestand met de naam insert-users.php.
    2. Plaats daarin de volgende code:
      <?php
      
      include('../config/vzwvrouwencentrum.modernways.be.php');
      include('../public_html/vendor/threepenny/CRUD.php');
      
      $person = array(
          ['FirstName' => 'Jef',
              'LastName' => 'Blij',
              'ShortName' => 'JI',
              'Gender' => 'M',
              'Email' => 'jef.blij@outlook.be',
              'Organisation' => 'Modern Ways'],
          ['FirstName' => 'Nursel',
              'LastName' => 'Tekin',
              'ShortName' => 'NT',
              'Gender' => 'V',
              'Email' => 'me@skynet.be',
              'Organisation' => 'VZW'],
          ['FirstName' => 'Jury',
              'LastName' => 'Wedstrijd',
              'ShortName' => 'JW',
              'Gender' => 'X',
              'Email' => 'jury@skynet.be',
              'Organisation' => 'VZWVrouwencentrum'],
          ['FirstName' => 'Martine',
              'LastName' => 'Blij',
              'ShortName' => 'MB',
              'Gender' => 'V',
              'Email' => 'martine.blij@telenet.be',
              'Organisation' => 'VZW']
      );
      
      $user = array(
          ['Name' => 'Jef',
              'HashedPassword' => password_hash('xxxxxxx', PASSWORD_DEFAULT),
              'PersonId' => '1',
              'Role' => 'Admin'],
          ['Name' => 'Nursel',
              'HashedPassword' => password_hash('xxxxxxx', PASSWORD_DEFAULT),
              'PersonId' => '2',
              'Role' => 'Operator'],
          ['Name' => 'Jury',
              'HashedPassword' => password_hash('xxxxxxx', PASSWORD_DEFAULT),
              'PersonId' => '3',
              'Role' => 'member'],
          ['Name' => 'Martine',
              'HashedPassword' => password_hash('xxxxxxx', PASSWORD_DEFAULT),
              'PersonId' => '4',
              'Role' => 'Admin']
      );
      
      $messages = \Threepenny\CRUD::create('Person', $person, 'LastName');
      foreach ($messages as $message) {
          echo $message . '<br/>';
      }
      
      $messages = \Threepenny\CRUD::create('User', $user, 'Name', array('HashedPassword'));
      foreach ($messages as $message) {
          echo $message . '<br/>';
      }
    3. We gebruiken hier de CRUD library van Threepenny.

    4. Start de webserver in de map /data, ga naar de data map en kies een vrije poort. In het voorbeeld gebruiken we poortnummer 63343.
      php -S localhost:63343
    5. Laad de pagina in de webrowser:
      http://localhost:63343/insert-users.php
    6. Als alles goed verloopt krijg je de melding dat de personen en de gebruikers toegevoegd zijn.
  5. Maak een beveiligde pagina met gebruikersnaam en paswoord
    1. Zet de Threepenny bibliotheken klaar:
      include('vendor/threepenny/CRUD.php');
      include('vendor/threepenny/Identity.php');
    2. Start een sessie
      1. Definiëer session parameters in het config bestand:
        define('SESSION_NAME', 'vzwvrouwencentrum');
        define ('HTTPS', false);
      2. Start de sessie:
        \Threepenny\Identity::startSession(SESSION_NAME, HTTPS);
    3. Maak een logging in component met de naam component/loggingin.php:
    4. De CSS voor de logging in component:
    5. Maak een component die geladen wordt als de gebruiker aangemeld is, bv. component/galerij-showroom.php.
    6. Telkens als de beveiligde pagina geladen wordt, ga je na of de gebruiker aangemeld is. Als die is aangemeld toon je de beveiligde informatie, in het andere geval toon je het logging in scherm:
      <div class="tower">
          <div class="floor" id="galerij">
              <?php
              include('component/control-panel.php');
              if (Threepenny\Identity::isInRoles(array('Admin', 'Jury'))) {
                  $model['message'][] = 'Je bent aangemeld.';
                  include('component/galerij-showroom.php');
              } else {
                  $model['message'][] = 'Geen toegang. Meld je aan met de juiste gebruikersnaam en paswoord';
                  include('component/loggingin.php');
              }
              ?>
          </div>
      </div>
    7. Als de gebruiker op de Login knop klikt moet je hem proberen aan te melden:
      if ($_SERVER['REQUEST_METHOD'] === 'POST') {
          if (isset($_POST['userName']) && isset($_POST['password'])) {
              \Threepenny\Identity::login($_POST['userName'], $_POST['password']);
          }
      }
  6. Directory inlezen
    1. Een methode om de bestanden met bepaalde extensies in te lezen. We plaatsen die voorlopig in de Helpers namespace. Deze methode aanvaardt twee parameters, $path om de naam van in te lezen directory op te geven en $fileExtensions, aan array met de bestandsextensies die weerhouden moeten worden:
    2. Maak een component om de html bestanden in een map te tonen en geef er de naam /component/view-directory.php aan

JI
2021-01-23 19:21:20