Autorizace pomocí anotací – Nette 2.0 beta checkroles()

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

V souvislosti s uvedením verze 2 beta jsem si všiml u Presenter a PresenterComponent metody checkRequirements, kde jse „základní“ implementace přihlášení. Proto si myslím, že by se to mohlo dotáhnout do konce. Mám tedy jen nějaký draft, jakou by to mohlo mít podobu.

  • zatím se řeší pouze část „výkonná“, tedy tryCall, resp start Presenteru. Druhá „odkazová“ ( zobrazit odkaz alias známé „n-if-allowed“ zatím neřeším.)
  • jakou udělat syntaxi? Byly zde různé nápady: @user, @allowed, @secured,… Mě napadlo a líbí se mi vyjít z metod User: loggedIn, inRole, allowed. (případně přidat „is“, ale to se mi moc nelíbí).
  • rozbor jednotlivých možností(použiji zkratky P pro celý presenter, resp M pro metodu):
    1. @loggedIn je zřejmé pro P i M
    2. @inRole: co když uvedu pole? Bude to platit jako AND nebo OR? Myslím, že o tom tady byla diskuze, zda se role používají hiaerchicky(redaktor znamená mít editora i člena) nebo se uvádí jejich výčet (role na sebe nabalujeme, až nám vznikne admin). Lepší se mi zdá první přístup , ale nakonec se dojde k tomu, že je to jedno. Bude se tedy počítat s možností vyjmenovat více rolí?
    3. @allowed. Zde to bude složitější
      • pro Presenter: symbolizuje možnost spustit tento presenter. Nechci svazovat ruce, takže je vhodné mít možnost uvést @allowed(Objednavky), ale i magicky @allowed($this) – kde se za resource doplní aktuální presenter.
      • pro Metody, ukážu v ukázce. Nevím pro co se rozhodnout, ale víc zápisů mi přijde matoucí. Je možno dosadit parametry. Použití $this je zatím dost nepochopitelné, ale je to třeba možné změnit na jiné placeholdery. – Resp, lze uvést ve sprintf formátu – např @allowed(article.$id,$method)

Ukázka:

/*
 * @loggedIn
 * -----
 * @inRole(editor)
 * @inRole(admin,role2) // OR nebo AND ?
 * -----
 * @allowed(Orders)
 * @allowed($this)  <-- Jmeno Presenteru
 */
class OrderPresenter{
	/*
	 * @loggedIn
	 * -----
	 * @inRole editor
	 * ----
	 * @allowed($id,editItem)  // resource:$id,privilege:editItem // není jasné, jak odlišit různé typy id, že by třetí parametr jako název třídy resource
	 * @allowed($id,$this) // res:$id,privilege:edit (z názvu metody)
	 * @allowed($this) // res: Order (z názvu Presenteru)
	 * @allowed($this,$this) // res:Order,privilege:edit
	 * @allowed(editArticles) //res: editArticles
	 */

	function actionEdit($id){ // svázat parametr
	}
}

Editoval bojovyletoun (30. 5. 2011 20:42)