Nastavení Authorizatoru – nedaří se zprovoznit

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Tymikes
Člen | 63
+
0
-

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.

Šaman
Člen | 2666
+
0
-

Píše to, že to našlo neznámou sekci. Takže odhaduji problém s tabama/mezerama v odsazení. Podle hlášky to vypadá, jako by tam to odsazení chybělo (a tedy services je prázdná a app.authorizatorFactory to považuje za novou sekci, kterou ale nezná).

Tymikes
Člen | 63
+
0
-
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
+
+1
-

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
+
0
-

A bude to fungovat pokud bych měl uživatele v tabulce?

//Hází mi to zase error
Found section ‚security.authorizator‘ in configuration, but corresponding extension is missing.

Editoval Tymikes (12. 2. 2016 21:31)

Tharos
Člen | 1030
+
0
-

Ad uživatelé v db) Ano, úplně stačí, když z té sekce security ty uživatele vyhodíš a v services si nadefinuješ vlastní implementaci IAuthenticator. Role a zdroje mohou zůstat staticky v config.neon.

Ad error) Jakou používáš verzi Nette? Jak vypadá Tvůj composer.json?

Tymikes
Člen | 63
+
0
-

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"
	}
}
Tharos
Člen | 1030
+
0
-

Ty jo, pak je to trochu záhada… Tady je aktuální sandbox jen s upravenou konfigurací podle mého popisu výše a aplikace normálně běží. Můžeš zkusit porovnat, v čem všem se lišíš… Nezapomeň taky samozřejmě pročistit všechny cache.

Tymikes
Člen | 63
+
0
-

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
+
+1
-

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)…

CZechBoY
Člen | 3608
+
0
-

U toho MyAuthenticator mas namespace \?
Pripadne dopln namespace.

Editoval CZechBoY (13. 2. 2016 10:34)

Šaman
Člen | 2666
+
0
-

@Tymikes Nasdílej možná celý projekt, resp. osekaný na nejnutnější základ – ideálně sandbox s tvoji chybou.

Tymikes
Člen | 63
+
0
-

Ž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.

Zuben45
Člen | 268
+
0
-

není to tím, že v presenteru Register využíváš userManager (construct), který je v konfigu zakomentovaný ? Zkusil bych to přepsat na ten tvůj ;)

Editoval Zuben45 (13. 2. 2016 22:30)

Tymikes
Člen | 63
+
0
-

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
+
+2
-

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. V app/templates máš originální ze sandboxu (ty smaž) a app/presenters/templates máš svoje, které se používají. Ten WTF moment nastává když hledám šablonu, jdu klasicky do app\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

  1. 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.
  2. 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.
  3. 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
+
0
-

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)