Nastavení Authorizatoru – nedaří se zprovoznit
- Tymikes
- Člen | 63
Zkoušel jsem vytvořit Authorizator, podle příspěvku zde
https://forum.nette.org/…zace-pouziti#…
Netušim jestli mi ještě něco chybí nebo je něco špatně.
Vytvořil jsem AuthorizatorFactory:
<?php
namespace App;
use Nette\Security\Permission;
class AuthorizatorFactory
{
/**
* @return \Nette\Security\IAuthorizator
*/
public function create()
{
$permission = new Permission();
$permission->addRole('registered');
$permission->addRole('admin', 'registered');
$permission->addResource('HomepagePresenter');
$permission->addResource('UkolPresenter');
$permission->deny('registered', 'HomepagePresenter');
//...
$permission->allow('admin', Permission::ALL, Permission::ALL);
return $permission;
}
}
Přidal jsem do configu
services:
app.authorizatorFactory: App\AuthorizatorFactory
app.authorizator: @app.authorizatorFactory::create
Ale hází mi to Error:
Found section ‚app.authorizatorFactory‘ in configuration, but corresponding
extension is missing.
- Tymikes
- Člen | 63
- services
- App\Model\UserManager
- App\Forms\SignFormFactory
app.authorizatorFactory: App\AuthorizatorFactory
app.authorizator: @app.authorizatorFactory::create
Zkoušim s tim hýbat, ale cokoliv jiný pak háže podobné:
Invalid combination of tabs and spaces on line 25, column 9.
Ale můžu tam napsat cokoliv, hláška je furt stejná.
Found section ‚app.authorizjtjatorFactory‘ in configuration, but
corresponding extension is missing
Editoval Tymikes (12. 2. 2016 19:46)
- Tharos
- Člen | 1030
Pes je zakopaný v tom, že ten návod je psaný pro trochu starší Nette… :)
Nette dneska umí nastavit role, zdroje i práva ještě pohodlněji. Takhle
může vypadat Tvůj config.neon
:
security:
roles:
authenticated:
editor: authenticated
admin: editor
resources:
articles:
settings:
users:
john:
password: pAssw0rd
martin:
password: heslo
roles: [editor]
jeff:
password: heslo
roles: [admin]
services:
security.authorizator:
setup:
- allow(NULL, [articles, settings], read) # všichni mohou číst všechno
- allow(editor, articles, update) # editor a (poděděný) admin navíc upravovat články
- allow(admin, settings, update) # a admin pak navíc ještě upravovat nastavení
Tak snad Ti to pomůže… :)
- Tymikes
- Člen | 63
Poslední verze 2.3.8
composer.json
{
"name": "nette/sandbox",
"description": "The sandbox is a pre-packaged Nette Framework project, basic configured structure for your application.",
"homepage": "https://nette.org",
"type": "project",
"license": ["BSD-3-Clause", "GPL-2.0", "GPL-3.0"],
"authors": [
{
"name": "David Grudl",
"homepage": "https://davidgrudl.com"
},
{
"name": "Nette Community",
"homepage": "https://nette.org/en/contributors?lang=en"
}
],
"require": {
"php": ">= 5.3.7",
"nette/application": "~2.3.6",
"nette/bootstrap": "~2.3.0",
"nette/caching": "~2.3.0",
"nette/database": "~2.3.0",
"nette/di": "~2.3.0",
"nette/finder": "~2.3.0",
"nette/forms": "~2.3.0",
"nette/http": "~2.3.0",
"nette/mail": "~2.3.0",
"nette/robot-loader": "~2.3.0",
"nette/safe-stream": "~2.3.0",
"nette/security": "~2.3.0",
"nette/utils": "~2.3.0",
"latte/latte": "~2.3.0",
"tracy/tracy": "~2.3.0",
"dg/adminer-custom": "~1.6"
},
"require-dev": {
"nette/tester": "~1.3"
}
}
- Tymikes
- Člen | 63
Nějak na to nemůžu přijít
Takhle vypadá, config, když zatim vše funguje
#
# WARNING: it is CRITICAL that this file & directory are NOT accessible directly via a web browser!
# https://nette.org/en/security-warning
#
parameters:
php:
date.timezone: Europe/Prague
application:
errorPresenter: Error
mapping:
*: App\*Module\Presenters\*Presenter
session:
expiration: 14 days
security:
roles:
authenticated:
editor: authenticated
admin: editor
resources:
articles:
settings:
services:
- App\Model\UserManager
- App\Forms\SignFormFactory
router: App\RouterFactory::createRouter
Pokud zakomentuju UserManager a přidám vlastní autentikátor
#
# WARNING: it is CRITICAL that this file & directory are NOT accessible directly via a web browser!
# https://nette.org/en/security-warning
#
parameters:
php:
date.timezone: Europe/Prague
application:
errorPresenter: Error
mapping:
*: App\*Module\Presenters\*Presenter
session:
expiration: 14 days
security:
roles:
authenticated:
editor: authenticated
admin: editor
resources:
articles:
settings:
services:
#- App\Model\UserManager
- App\Forms\SignFormFactory
router: App\RouterFactory::createRouter
authenticator: MyAuthenticator
Tak zase ta samá hláška. Jinak jsem se koukal a zkoušel nasadit na to tvoje a zase chyba. Není problém ve způsobu, jak využívám toho UserManagera, takhle např. vypadá Presenter s registrací
<?php
namespace App\Presenters;
use Nette;
use App\Model;
use App\Model\UserManager;
class RegisterPresenter extends BasePresenter
{
private $userManager;
protected function createComponentRegisterForm()
{
$form = new Nette\Application\UI\Form;
$form->getElementPrototype()->class[] = "form-group";
$form->addText('username', 'Username:')
->setRequired('Prosím vyplňte uživatelské jméno.');
$form->addPassword('password', 'Password:')
->setRequired('Prosím vyplňte heslo.');
$form->addSubmit('send', 'Register');
// call method signInFormSucceeded() on success
$form->onSuccess[] = array($this, 'registerFormSucceeded');
return $form;
}
public function __construct (UserManager $userManager)
{
$this->userManager = $userManager;
}
public function registerFormSucceeded ($form, $values)
{
$this->userManager->add($values['username'], $values['password']);
$this->flashMessage('Vaše registrace proběhla úspěšně', 'success');
try {
$this->getUser()->login($values->username, $values->password);
$this->redirect('Homepage:');
} catch (Nette\Security\AuthenticationException $e) {
$form->addError($e->getMessage());
}
}
}
- Tharos
- Člen | 1030
No, předně UserManager
implementuje
IAuthenticator
, tak jako pravděpodobně ten Tvůj
MyAuthenticator
. Musíš se rozhodnout jen pro jednu z těch
implementací. A ty v konfiguraci UserManager
zakomentuješ, ale
pak s ním v presenteru pracuješ. :)
Zkontroluj prosím, jestli máš konzistentní tohle (byť by to vedlo na jinou chybovou hlášku)…
- Tymikes
- Člen | 63
Že musím pracovat s jedním z nich to mi pak došlo, ale asi to stejně to je nějaké divné. Podle toho co jsem zkoušel tak vyhazuje chybu i když nepoužívá Autenthicator, ale nejsem si jistý 100%. Namespace jsem taky zkoušel dát a bohužel nepomohlo. Tak to udělám jinak, jak nastavit a kde ACL s tím UserManagerem, co je výše.
- Tymikes
- Člen | 63
http://leteckaposta.cz/630287111
Tady je víceméně celý projekt, beztak tam skoro nic není. Mojí prioritou
je spíš rozchodit nějak ACL a ať to klidně běží na UserManagerovi, abych
se nemusel přepisovat.
Jediný na co jsem si vzpomněl je, že jsem hned na začátku zakomentoval nějaký error (který se objevil, hned jak jsem vytvořil nový projekt, což netuším proč, ale nejspíš to s tím nemá nic společného)
Byl to tento řádek umístění
\vendor\nette\tester\tests\Framework\Dumper.toPhp.php7.phpt
<?php
/**
* @phpversion 7
*/
use Tester\Assert;
use Tester\Dumper;
require __DIR__ . '/../bootstrap.php';
/*Tento řádek podmenou netbeans podtrhává */
Assert::match('/* Anonymous class defined in file %a% on line %d% */', Dumper::toPhp(new class {}));
Editoval Tymikes (27. 2. 2016 12:26)
- Šaman
- Člen | 2666
Už jen při prvním pohledu na config vidím, že mícháš taby (skoro
všude) a mezery (v sekci security
). Zkusím se na to
podívat.
Tak jsem se na to podíval o něco lépe a moje doporučení je: Začni znovu na prázdném sandboxu (nebo web-project).
- Vždycky odlaď jednu věc a pak teprve přidávej další.
- Nikdy neupravuj nic ve vendor (to jen k tvému minulému příspěvku – já jsem si vendor raději nainstaloval znovu).
- Projekt nešel spustit. Přesměrovával sám na sebe. Nevím kde, nejspíš někde v HomepagePresenteru, protože po jeho pročištění mi konečně naběhla laděnka. Všechno předtím (.htaccess, index, bootstrap) vypadá v pořádku, resp. originální. (Edit – už vím proč, píšu o tom na konci.)
- V configu mícháš ony taby a mezery, ale kupodivu to nevadí – nejspíš si svůj kód extenze parsuje sama. Pokud míchám taby a mezery jinde, nebo i uvnitř sekce, pak dostanu chybu. Je lepší používat jen jedno (v sandboxu jsou taby), ale to v tvém případě to chybu nezpůsobuje.
- Co rozhodně v pořádku není je BasePresenter. Je prázdný (uzavírcí
závorka na řádku 16), ale pak teprve definuješ objekt Permission zcela mimo
presenter. Po includování tohoto souboru ti v globálním prostoru někde
visí proměnná
$acl
, která se zřejmě nikde nepoužije. - Co je FormPresenter? Resp. vím co to je. Ale není to presenter, je to
ukázka použití samotného
Nette\Forms\Form
v kódu. Naštěstí se nikde nepoužívá, ale raději to z projektu úplně odstaň. a zdůrazňuji, že to není presenter. - Další WTF moment je že máš dvě složky
templates
. Vapp/templates
máš originální ze sandboxu (ty smaž) aapp/presenters/templates
máš svoje, které se používají. Ten WTF moment nastává když hledám šablonu, jdu klasicky doapp\templates\Homepage\default.latte
, zjistím, že tam je ta ze sandboxu a vůbec netuším, proč se mi laděnka hlásí neexistující proměnnou$ukoly
.
Nemám tvoji databázi, takže jsem skončil u nemožnosti načíst úkoly. Ale chyba, kterou jsi popisova nahoře se mi neprojevila. Rozhodně ale doporučuji začít znovu načisto, protože už teď je ten projekt v dezolátním stavu a nikdy nevíš, kdy se ti projeví nějaký problém (třeba z toho divného BasePresenteru).
Pokud začneš znovu, tak si
- pročisti sandbox – tedy promaž šablonu
app\templates\Homepage\default.latte
nebo, pokud chceš používat jinou strukturu, tak úplně smažapp\templates
. Pak zbývá už jen ten řádek v HomepagePresenter v metodě renderDefault a máš čisto pro další práci. - Abys zabránil možnému nekonečnému přesměrování (to se stalo u mě), tak počítej s tím, že uživatel může být přihlášen, ale nemá žádnou tvoji roli. Vzniká to tím, že na localhostu (když jsem líný vytvářet doménové aliasy) jsou sdílené session. Takže já jsem podle Nette přihlášen (z minulé aplikace), ale role mám jiné. U tebe mě to přesměrovalo samo na sebe.
- Raději nepřidávej kusy kódu, o kterých nevíš, co jsou zač. Když tam zůstanou, budou časem dělat problémy. Všechno nejprve odlaď, případně zrefaktoruj, a pak teprve pokračuj.
Editoval Šaman (14. 2. 2016 12:16)
- Tymikes
- Člen | 63
Jo, já jsem se v tom trochu hrabal, tak jsem tam zkoušel blbosti, takže vim, že je tam plno nesmyslů. O tom přesměrování, vim, kde je problém. V Basepresenteru jsem přidával to acl, protože vůbec nevim, jak ho jinam narvat. FormPresenter je další věc někde zkopírovaná, když jsem něco testoval a nesmazal jsem to (takových věcí tam vysí víc). Já to trochu zúhledním. Ale problém je, že si pořád nevím, poradit s těmi rolemi, zkoušel jsem různé věci ale nevim jak to rozchodit.
Ohledně té 2. že uživatel nemusí mít moje role, to by se potom mělo odladit přihlášením registrovaného uživatele, který určitě nějakou roli mít bude, přístup nepřihlášeného nebude. Jen na to přihlašování se to musí vyřešit. Opakuju, že vim že jsem poslal guláš, protože jsou zkoušel různý věci, páč mi nic nefungovalo.
Editoval Tymikes (14. 2. 2016 13:00)