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\AdminModule\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\AdminModule\templates\Sign\default.latte
{block content}
<h1>Přihlášení</h1>
{control signInForm}
BasePresenter.php ve složce app\AdminModule\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');