Více nezávislých přihlášení

Tento příklad používá moduly – ukázku rozdělení na moduly naleznete na hlavní straně

Konfigurace

services:
    -
        factory: App\Model\User\Manager
        autowired: self
    -
        factory: App\Model\Admin\Manager
        autowired: self

AdminManager.php ve složce app\Model\Admin

Obě třídy (Admin\Manager i User\Manager) mají jméno a heslo pevně dané v kódu.

Je to zjednodušení pro tuto ukázku.

<?php

namespace App\Model\Admin;

use Nette;
use Nette\Security\SimpleIdentity;

/**
* Přihlašovací údaje
* jméno: admin
* heslo: heslo
*/
class Manager implements Nette\Security\Authenticator{

    private $passwords;

    public function __construct(Nette\Security\Passwords $passwords) {
        $this->passwords = $passwords;
    }

    public function authenticate(string $jmeno, string $heslo): SimpleIdentity {
        if($jmeno !== 'admin'){
            throw new Nette\Security\AuthenticationException('Uživatel nenalezen');
        }

        if(!$this->passwords->verify(
            $heslo,
            '$2y$10$h0u/eqlMvfXGDgjYZVehEeF.GGoRlqfrCbl5cl2U81tFlU7ub67F6' /*hash slova heslo*/)
        ){
            throw new Nette\Security\AuthenticationException('Špatné heslo');
        }


        return new Nette\Security\SimpleIdentity($id = 1);
        # do identity můžete vložit i další data
        # ($id, $roles = null, iterable $data = null)
    }

}

UserManager.php ve složce app\Model\User Tato třída je nutná kvůli konfiguraci popsané výše

<?php

namespace App\Model\User;

use Nette;
use Nette\Security\SimpleIdentity;

/**
* Přihlašovací údaje
* jméno: user
* heslo: heslo
*/
class Manager implements Nette\Security\Authenticator{

    private $passwords;

    public function __construct(Nette\Security\Passwords $passwords) {
        $this->passwords = $passwords;
    }

    public function authenticate(string $jmeno, string $heslo): SimpleIdentity {
        if($jmeno !== 'user'){
            throw new Nette\Security\AuthenticationException('Uživatel nenalezen');
        }

        if(!$this->passwords->verify(
            $heslo,
            '$2y$10$h0u/eqlMvfXGDgjYZVehEeF.GGoRlqfrCbl5cl2U81tFlU7ub67F6' /*hash slova heslo*/)
        ){
            throw new Nette\Security\AuthenticationException('Špatné heslo');
        }


        return new Nette\Security\SimpleIdentity($id = 1);
        # do identity můžete vložit i další data
        # ($id, $roles = null, iterable $data = null)
    }

}

SignPresenter.php ve složce app\AdminModu­le\Presenters

<?php

namespace App\AdminModule\Presenters;

use Nette;
use Nette\Application\UI\Form;

class SignPresenter extends Nette\Application\UI\Presenter{

    /** @var \App\Model\Admin\Manager @inject */
    public $adminManager;

    public function startup() {
        parent::startup();
        $this->user->getStorage()->setNamespace('admin');
        $this->user->setAuthenticator($this->adminManager);
    }

    public function renderDefault(){
    }

   /**
     * Vytvoření přihlašovacího formuláře
     */
    protected function createComponentSignInForm()
    {
        $form = new Form();

        $form->addText('jmeno', 'Jméno:')
                ->setRequired('Zadejte jméno.');

        $form->addPassword('heslo', 'Heslo:')
                ->setRequired('Zadejte heslo.');

        $form->addSubmit('prihlasit', 'Přihlásit');

        $form->onSuccess[] = function(Form $form, $values){

             try{
                 $this->user->login($values->jmeno, $values->heslo);
                 $this->redirect(':Admin:Homepage:default');
             }catch(Nette\Security\AuthenticationException $e){
                 $form->addError($e->getMessage());
             }

        };

        return $form;
    }
}

Šablona s formulářem pro přihlášení app\AdminModu­le\templates\Sig­n\default.lat­te

{block content}

<h1>Přihlášení</h1>

{control signInForm}

BasePresenter.php ve složce app\AdminModu­le\Presenters

<?php

namespace App\AdminModule\Presenters;

use Nette;
use Nette\Application\UI\Form;

class BasePresenter extends Nette\Application\UI\Presenter{

    # Presentery extendující BasePresenter automaticky zkontrolují přihlášení do tohoto modulu

    public function startup() {
        $this->user->getStorage()->setNamespace('admin');

        if(!$this->user->isLoggedIn()){
            $this->flashMessage('Nejste přihlášeni');
            $this->redirect(':Admin:Sign:default');
        }
    }

}

Pro další modul – např. User – můžete použít stejný kód.

V souborech jenom na změníte:

# namespace souborů
namespace App\UserModule\Presenters;

#injectovanou třídu s metodou authenticate()
/** @var \App\Model\User\Manager @inject */
public $userManager;

# storage namespace
$this->user->getStorage()->setNamespace('user');

# authenticator
$this->user->setAuthenticator($this->userManager);

# redirect po přihlášení
$this->redirect(':User:Homepage:default');