Vykreslení prvků v šabloně podle oprávnění

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

Ahoj,

úspěšně jsem podle návodů, které jsem sesbíral zde na fóru, zprovoznil přihlášení uživatele. Nikde jsem však nenašel jednu věc. Jak mohu v šabloně (nebo presentru?) určit, které prvky na stránce vykreslit jen přihlášeným uživatelům? Řekněme, že nechci po přihlášení vykreslit formulář pro přihlášení, a chci vykreslit třeba menu navíc. Jak toho dosáhnu?

Díky moc!

redhead
Člen | 1313
+
0
-

no dokud nebudeš chtít používat složitější řešení s rolema a resourcama, můžeš použít tento kód v startup metodě BasePresenteru

$this->template->isLogged = Environment::getUser()->isAuthenticated();

a v šabloně např.:

{if $isLogged}
	//menu
{/if}

{if !$isLogged}
	//prihlasovaci formular
{/if}

ale není to nejlepší.
(viz Autorizace)

weckho
Člen | 94
+
0
-

Díky moc za odpověď, rozumím. Mohu ještě poprosit o praktický příklad kódu šablony, pokud se rozhodnu použít autorizaci na základě rolí? Dejme tomu, že se úspěšně přihlásím jako administrátor a opět chci vykreslit menu, které má vidět pouze administrátor.

Díky moc!

redhead
Člen | 1313
+
0
-

k tomu pak slouží:

//napriklad
Enviroment->getUser()->isAllowed('admin_menu');  //admin_menu je resource
//a nebo ještě lepší
Enviroment->getUser()->isInRole('admin');  //admin je role

je to popsáno v tom článku co jsem posílal

Editoval redhead (24. 8. 2009 0:17)

Patrik Votoček
Člen | 2221
+
0
-

Já sem si na to napsal vlastní makro…

class CurlyBracketsExtra
{
	/**
	 * If allow macro by presenter link
	 *
	 * @param IPresenter $presenter
	 * @param string $link
	 */
	public static function ifAllow(IPresernter $presenter, $link)
	{
		$presenter->link($link);
		$presenterRequest = $presenter->lastCreatedRequest;
		$params = $presenterRequest->getParams();
		$signal = isset($params['do']) ? "signal_".$params['do'] : FALSE;
		$signal = strpos($signal, '-') === FALSE ? $signal : FALSE;

		if ($signal === FALSE)
			return Environment::getUser()->isAllowed($presenterRequest->getPresenterName(), $params['action']);
		else
		{
			if (Environment::getUser()->isAllowed($presenterRequest->getPresenterName(), $params['action']))
			{
				if (Environment::getUser()->isAllowed($presenterRequest->getPresenterName(), $signal))
					return TRUE;
			}
		}

		return FALSE;
	}
}

Je to dost specificke protoze moje ACL vrstva je zjednodusene receno neco takoveho:

resource = presenter name
privilege = action name / signal name s prefixem 'signal_'

vice viz: https://doc.nette.org/…thentication

pak uz to v sablone pouzivas stejne jako presenter link (plik) makro

{ifAllow Admin:}<a href="{plink Admin:}">Admin</a>{/if}

Edit: zapomel jsem definici makra

'ifAllow' => "<?php if (CurlyBracketsExtra::ifAllow(\$presenter, %%)): ?>",

Editoval vrtak-cz (23. 8. 2009 23:57)

weckho
Člen | 94
+
0
-

Díky. Mám přihlášeného uživatele v roli admina a potřebuji teď vykreslit v šabloně to menu. Jak přímo v kódu šablony zajistím, že se menu vykreslí jen adminovi (uživateli s rolí admin)? V článku o autorizaci není ukázka kódu šablony.. trochu v tom plavu.

Díky moc.

Panda
Člen | 569
+
0
-

K objektu uživatele můžeš z šablony přistupovat stejně jako z presenteru:

{if Environment::getUser()->isInRole('admin')}
	{* ... *}
{/if}

Samozřejmě, že si na to opět můžeš udělat makro. Také stojí za zvážení přiřazení objektu User do šablony, ať se pořád nevolá metoda Environment::getUser().