Automatická autorizácia pre views

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

Nazdar,

pre galériu ktorú teraz kódim pomocou Nette by sa mi dosť hodilo automatické overovanie práv (priviligies). Predstavoval by som si to asi takto:

  1. Pri view sa v komentári zadalo niečo v štýle /** @priviligies ALBUM_CREATE */ alebo /** @privilegies ALBUM_CREATE ALBUM_DELETE */
  2. Pokiaľ nemá užívateľ práva ako sú definované v komentári, tak sa mu ukáže chybová stránka.
  3. V šablóne by sa automaticky nezobrazovali odkazy, ktoré smerujú na view na ktorú nemá užívateľ práva si ju zobraziť

Tak ako si to predstavujem by asi bolo dosť časovo náročné, ale napríklad tie odkazy by sa vedeli celkom dobre kešovať.

Zatiaľ to riešim asi takto:

  1. Vo view vždy volám pred jej samotným vykonaním metódu verifyPriviligies, ktorá dostane zoznam privilégií čo sú potrebné.
  2. Do šablóny som si vytvoril tag {@}, ukážka:
    {@ ALBUM_CREATE}<a href="nette:Album:create">Create new album!</a>{/@}

Funguje to celkom fajn, ale prieči sa to voči zásade nič nepísať dvakrát ;-) Udržiavať toto na dvoch miestach síce nie je ťažké, ale aj tak – je to robota navyše.

A.
Člen | 87
+
0
-

Nerozsiroval bych Nette konkretnimi vecmi, ktere lze snadno udelat (volani jedne metody mi na obtiz neprijde). A uz vubec ne dalsimi phpdoc vecmi.

Hodnota uzitku ziskaneho je dle meho nazoru nizsi nez hodnota „jednoduchosti“ Nette, ktera by tim utrpela. Molochoidnich frameworku je spousta.

Panda
Člen | 569
+
0
-

Ta automatická autorizace z komentářů lze celkem dobře realizovat v metodě startup() v nějakém abstraktním předkovi všech potřebných presenterů, pro představu asi nějak takto:

<?php
abstract class Admin_BasePresenter extends BasePresenter
{
	...

	public function startup()
	{
		parent::startup();

		...

		$reflection = $this->getReflection();
		$comments = '';
		$possiblePrefixes = array('action', 'render');
		$action = $this->getAction();

		foreach($possiblePrefixes as $prefix)
		{
			if($reflection->hasMethod($methodName = $prefix.$action))
			{
				if(($comment = $reflection->getMethod($methodName)->getDocComment()) != false)
					$comments .= $comment;
			}
		}

		if(!empty($comments))
		{
			// Zpracování $comments, autorizace, vyhození případných výjimek...
		}

		...
	}

	...
}
?>

Do Nette bych to ale asi nedával, nechal bych to na samotné aplikaci.