Guide

Prosta autoryzacja

Zacznijmy od stworzenia encji w której będziemy przechowywać dane o użytkowniku. Ważnymi w tej klasie metodami pomocniczymi są isLogged() który w przypadku wywołania z parametrem w konstuktorze ustawa nam wartość logiczną true/false. Stworzymy go jako moduł by w późniejszym czasie można było go rozbudować.

modules/Users/src/Entity/UserEntity.php

<?php

/**
 * Project Name
 * Copyright (c) Firstname Lastname
 *
 * @license http://yourLicenceUrl/ (Licence Name)
 */
  
namespace Modules\Users\Entity\Users;

/**
 * Class User
 *
 * @package Modules\Users\Entity\Users
 */
class UserEntity
{

    /**
     * @var int
     */
    protected $id;

    /**
     * @var string
     */
    protected $username;

    /**
     * @var string
     */
    protected $email;

    /**
     * @var string
     */
    protected $lastActive;

    /**
     * @var bool
     */
    private $isLogged = false;


    /**
     * User constructor.
     *
     * @param null $id
     */
    public function __construct($id = null)
    {
        if (isset($id) and !empty($id)) {
            $this->isLogged = true;
            $this->setId($id);
        }
    }

    /**
     * @return bool
     */
    public function isLogged()
    {
        return $this->isLogged;
    }

    /**
     * @param $id
     */
    public function setId($id)
    {
        $this->id = $id;
    }

    /**
     * @return mixed
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @return mixed
     */
    public function getUsername()
    {
        return $this->username;
    }

    /**
     * @return mixed
     */
    public function getEmail()
    {
        return $this->email;
    }

    /**
     * @param $username
     */
    public function setUsername($username)
    {
        $this->username = $username;
    }

    /**
     * @param $email
     */
    public function setEmail($email)
    {
        $this->email = $email;
    }

    /**
     * @return array
     */
    public function getData()
    {
        return [
            'id' => $this->id,
            'email' => $this->email
        ];
    }
}

Gdy stworzymy Encje w folderze modules/users/src/ tworzymy plik Modules.php

modules/users/src/Modules.php

<?php

namespace Users;

use Dframe\Modules\ManagerModule;

class Module extends ManagerModule
{

    public function boot()
    {
    }


    public function register()
    {
    }

}

Do Composer.json należy dodać namespace \\Modules\\Users\\

"autoload": {
    "psr-4": {
        "": "app/",
        "Modules\\Users\\": "modules/users/src",
    }
}

Oraz do app/Bootstrap.php należy dodać

$this->providers['modules'] = [
    \Modules\Users\Module::class
];

   

Następnie musimy stworzyć config w którym ustawimy dane do logowania. Ten już stworzymy w głównym folderze aplikacji.

app/Config/users.php

<?php 

return [
    'users' => [
        [
            'id' => 1,
            'username' => '__Login__',
            'password' => '__Password__For_Example_MD5__'
        ]
    ]
];

Na końcu stworzmy nasz kontroler do logowania

app/Controller/User.php

<?php

namespace Controller;

use Dframe\Config;

class UserController extends \Controller\Controller
{
    /**
     * @return mixed
     */
    public function login()
    {

        if (isset($_POST) and !empty($_POST)) {

            if (!$this->baseClass->token->isValid('loginToken', (isset($_POST['token']) ? $_POST['token'] : null),
                true)) {
                return $this->baseClass->msg->add('e', 'Formularz wygasł.', 'page/login');
            }

            $UsersConfig = Config::load('users');

            foreach ($UsersConfig->get('users') as $key => $value) {
                if ($value['username'] == $_POST['username'] AND $value['password'] == md5($_POST['password'])) {
                    $this->baseClass->session->register();
                    $this->baseClass->session->set('id', $value['id']);
                    $this->baseClass->session->set('username', $value['username']);
                    return $this->router->redirect('page/index');
                }
            }

            return $this->baseClass->msg->add('e', 'Not Found', 'page/login');

        }

        return $this->router->redirect('page/login');
    }

    /**
     * @return mixed
     */
    public function logout()
    {
        $this->baseClass->session->end();
        // Usuwanie cookie z last page
        unset($_COOKIE['currentPage']);
        setcookie("currentPage", "", time() - 3600, "/");
        return $this->router->redirect('page/login');
    }

}

Gdy już stworzymy kontroler który nam ustawia dane do sesji użymy

app/Controller/Page.php

<?php

 /**
 * Project Name
 * Copyright (c) Firstname Lastname
 *
 * @license http://yourLicenceUrl/ (Licence Name)
 */
 
 namespace Controller;

class PageController extends \Controller\Controller
{
    /**
     * @return mixed
     */
    public function login()
    {

        $User = new \Modules\Users\Entity\User($this->baseClass->session->get('id', 0));
        if ($User->isLogged() !== true) {  // Sprawdzany czy użytkownik jest zalogowany
            $View = $this->loadView('Index');

            $loginToken = $this->baseClass->token->get('loginToken'); // Generowanie tokena Zabezpieczającego kontroler logowania
            $View->assign('loginToken', $loginToken);
            return $View->render('page/login');
        }
        
        

        return $this->router->redirect('');
    }

}

Teraz czas na abstrakcyjną klasę która będzie naszym middleware'm i będzie sprawdzała czy osoba jest zalogowana.

app/Controller/AbstractAuthController.php

<?php

/**
 * Project Name
 * Copyright (c) Firstname Lastname
 *
 * @license http://yourLicenceUrl/ (Licence Name)
 */
  
namespace Controller;

abstract class AbstractAuthController extends \Controller\Controller
{
    
    /**
     * @var \Modules\Users\Entity\User
     */
    protected $User;

    /**
     * @return mixed
     */
    public function init()
    {
        $currentPage = (isset($_SERVER['HTTPS']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
        @setcookie("currentPage", $currentPage, 0, '/');
        
        /** 
         * Sprawdzamy czy istenije sesja
         */
        if ($this->baseClass->session->authLogin() != true) {
            return $this->router->redirect('page/login');
        }
        
        $this->User = new \Modules\Users\Entity\User($this->baseClass->session->get('id', 0));
        $this->User->setUsername($this->baseClass->session->get('username'));
    }


}

Teraz przykłądowa klasa która będzie objęta naszą abstrakcyjną klasą

app/Controller/Panel/Services.php

<?php

/**
 * Project Name
 * Copyright (c) Firstname Lastname
 *
 * @license http://yourLicenceUrl/ (Licence Name)
 */

namespace Controller\Panel\Services;

use Dframe\Router\Response;

/**
 * Here is a description of what this file is for.
 *
 */
class ServicesController extends \Controller\AbstractAuthController
{

    /**
     * @return mixed
     */
    public function index()
    {
        $View = $this->loadView('Index');
        $View->assign('urls', [
            'services' => $this->router->makeUrl('api/panel/services'),
        ]);

        return Response::Create($View->fetch('services/index'))->status(200);
    }
Edit page (Guide/adding-a-simple-authentication/overview)