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
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):
- @loggedIn je zřejmé pro P i M
- @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í?
- @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)
- pro Presenter: symbolizuje možnost spustit tento presenter. Nechci svazovat
ruce, takže je vhodné mít možnost uvést
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)