Jedná se o rozšíření systému rolí aplikace flexideo o tzv. dodatečné role. Atribut opt-roles speciální atribut, který lze použít u některých požadavků k určení optimálních rolí vhodných pro jeho provedení. Tento atribut rozšiřuje výchozí roli uživatele tak, že může, v závislosti na konkrétních potřebách, jednat jako člen další role. Role k nímž má uživatel přístup mohou (ale nemusí) být opakovatelnou oblastí uživatele. Pokud tato oblast u uživatele uvedena není, pak se rozšířené role v té konkrétní implementaci neuplatňují.
Obsah atributu opt-roles
Atribut opt-roles je čárkami odděleným seznamem vhodných rolí k provedení požadavku. Seznam rolí je chápán, jako seřazený podle priority, tedy první role je nejvhodnější, druhá je druhá nejvhodnější a tak dále. Zvláštní hodnotou atributu je klíčové slovo default, to zajistí, že je vždy použita výchozí role uživatele.Příklad
opt-roles="2,4,7"Průběh zpracování atributu opt-roles
Atribut opt-roles je zpracováván ve třech krocích a to následujícím způsobem:Je-li hodnota atributu default, je zvolena výchozí role uživatele.
Je hledána první role uvedená v atributu, které je zároveň členem i uživatel (výchozí role uživatele je brána jako jedna z rolí, jíž je členem)
Není-li nalezena, je zvolena výchozí role uživatele
Příklady
V požadavku je uveden atribut opt-roles="2,4,7".Uživatel má výchozí roli 10 a dodatečné role 7 a 8. Bude vybrána role 7 (jako prvni shoda s attributem, pravidlo 2)
Uživatel má výchozí roli 10 a dodatečné role 8 a 9. Bude vybrána role 10 (jako jeho výchozí role, pravidlo 3)
Uživatel má výchozí roli 2 a dodatečné role 4 a 7. Bude vybrána role 2 (jako prvni shoda s attributem, pravidlo 2)
Uživatel má výchozí roli 7 a dodatečné role 2 a 4. Bude vybrána role 2 (jako prvni shoda s attributem, pravidlo 2)
Uživatel má výchozí roli 7 a dodatečné role 3 a 4. Bude vybrána role 4 (jako prvni shoda s attributem, pravidlo 2)
Požadavky, ve kterých lze použít atribut opt-roles
Atribut opt-roles je možno použít v řadě požadavků, způsob chování (zpracování) atributu je velmi podobný, přesto jsou zde drobné rozdíly, které jsou blíže popsány níže. Začněme tedy prostým seznamem požadavků, kde je atribut přípustný:request
get-document
save-document
get-history
get-pseudo-document
save-pseudo-document
sql-query
transform
action
register
max-key
send-email
drop-email
do-action
do-request
do-export
do-import
Autentifikační řetězec přiložených souborů
AD request
Nastavuje optimální role pro všechny synovské uzly (požadavky). Význam kaskádového zpracování je vysvětlen ve zvláštní kapitole.AD get-document, get-pseudo-document
U těchto požadavků je možné použít atribut jak v těle požadavku, tak v synovském uzlu document. Význam kaskádového zpracování je vysvětlen ve zvláštní kapitole. Při používání kombinací požadavků s vícero atributy opt-role je vhodné rovněž prostudovat kapitolu věnující se optimalizaci při práci s dodatečnými rolemi.AD save-document, save-pseudo-document
Zde je možno použít atribut pouze v těle požadavku. Je-li potřeba během jednoho requestu ukládat pod vícero rolemi, je nutno zadat více save-document, resp. save-pseudo-document požadavků.AD get-history
Zde je možno zadat atribut buď do těla požadavku, nebo do možných synovských tagů list a document. Význam kaskádového zpracování je vysvětlen ve zvláštní kapitole. Při používání kombinací požadavků s vícero atributy opt-role je vhodné rovněž prostudovat kapitolu věnující se optimalizaci při práci s dodatečnými rolemi.AD sql-query
Zde je možno zadat atribut buď do těla požadavku, nebo do jeho synovských tagů zpravidla select. Význam kaskádového zpracování je vysvětlen ve zvláštní kapitole. Při používání kombinací požadavků s vícero atributy opt-role je vhodné rovněž prostudovat kapitolu věnující se optimalizaci při práci s dodatečnými rolemi.AD transform, action
U požadavku action je zvolená role použita k zajištění přístupu k akci přes systém práv z registru akcí. U obou požadavků se atribut opt-roles vztahuje především ke tvořeným požadavkům, předávaným serveru. Umožňuje tak zvolit roli, pod kterou budou následně transformacemi vytvořené požadavky provedeny. To však těmto tvořeným požadavkům nebraní opět zvolit roli pomocí nasledného, čí následných atributů opt-roles. Význam kaskádového zpracování je vysvětlen ve zvláštní kapitole.AD register
Umožňuje zvolit doporučenou roli pro následně prováděný registrovaný požadavek. Stejného výsledku lze dosáhnout vložením atributu přímo do registrovaného požadavku. Význam kaskádového zpracování je vysvětlen ve zvláštní kapitole.AD max-key
Umožňuje vybrat vhodnou roli tak, aby měla přístup k příslušnému dokumentu.AD send-email, drop-email
Zde je atribut pouze využíván k zajištění přístupu k emailovému profilu. Lze tak například definovat odesílací roli a její člšnové tak pak mohou odesílat maily.AD do-action, do-request
Atribut je možné zadat do těla požadavku. Atribut je využíván podobně, jako u požadavků transform a action. Slouží tedy především k nastavení doporučené role pro následné požadavky. Ani zde tento postup nebrání následnému použití dalších atributů opt-roles. Stejně jako u požadavku action, je i zde doporučená role použita při získávání opravnění z registru akcí. Význam kaskádového zpracování je vysvětlen ve zvláštní kapitole.AD do-export
Atribut je možno zadat do těla požadavku, nebo do jednotlivých tagů s exportními dotazy. Atribut slouží pro nastavení optimální role pro provádění dotazů, které se stanou zdrojem pro export. Při používání kombinací požadavků s vícero atributy opt-role je vhodné rovněž prostudovat kapitolu věnující se optimalizaci při práci s dodatečnými rolemi.AD do-import
Atribut je možno zadat pouze do těla požadavku. Atribut slouží pouze jako rozšířený zdroj oprávnění uživatele pro provedení importu.Kaskádové zpracovávání dodatečných rolí
Jak již bylo naznačeno výše, atributy opt-roles je možné kaskádovat. Pro každý požadavek tedy platí ten opt-roles atribut, který je uveden hierarchicky nejblíže nad ním.Příklad:
<request opt-roles="1,2,3"> <sql-query> <select> "Zde platí opt-roles="1,2,3"" </select> </sql-query> "Zde by pro požadavky platil opt-roles="1,2,3"" <sql-query opt-roles="4,5,6"> <select> "Zde platí opt-roles="4,5,6"" </select> <select> "Zde platí opt-roles="4,5,6"" </select> <select opt-roles="7"> "Zde platí opt-roles="7"" </select> <select> "Zde platí opt-roles="4,5,6"" </select> </sql-query> "Zde by pro požadavky platil opt-roles="1,2,3"" <transform opt-roles="4,7"> "Zde se pro prováděné požadavky zdědí opt-roles z tagu transform, tedy opt-roles="4,7"" </transform> "Zde by pro požadavky platil opt-roles="1,2,3"" <action> "Zde se pro prováděné požadavky zdědí opt-roles z tagu request, tedy opt-roles="1,2,3"" </action> </request>Takto napsaný požadavek by byl značně neoptimální, viz další kapitola.
Optimalizace pri práci s dodatečnými rolemi
Každá změna role vede k opětovnému přihlášení k databázi, každé takové přihlášení je spojené s jistými náklady, zejména časovými. Proto je vhodné, je-li to možné, požadavky, které budou prováděny pod stejnou rolí seskupovat. K opětovnému přihlášení dochází při každé změně role, bez ohledu na to, v jaké hloubce ke změně dojde. U požadavků do-... nedochází k přímé změne role, role se mění až v okamžiku jeho vykonávání, takže tato kapitola se jej týká jen do té míry, že opět při jeho vykonávaání je vhodné kumulovat stejným způsobem. Viz následující příklady.Příklad 1 (srovnání dvou možností)
Následující kaskádu požadavků<sql-query> <select opt-roles="2,3,4">...</select> <select opt-roles="5,6,7">...</select> <select opt-roles="2,3,4">...</select> <select opt-roles="5,6,7">...</select> </sql-query>je mnohem vhodnější provést takto
<sql-query> <select opt-roles="2,3,4">...</select> <select opt-roles="2,3,4">...</select> <select opt-roles="5,6,7">...</select> <select opt-roles="5,6,7">...</select> </sql-query>.
Příklad 2 (skrytá změna role)
<request> <sql-query opt-roles="2,3,4"> <select>...</select> <select>...</select> <select>...</select> <select>...</select> </sql-query> <action> Kdesi (hluboko) v těle akce se vyskytne opt-roles="5,6,7" </action> <sql-query opt-roles="2,3,4"> <select>...</select> <select>...</select> <select>...</select> <select>...</select> </sql-query> </request>Je opět vhodnější zapsat tak, aby akce která změnu role vyvolá, byla buď na začátku, nebo na konci.
<request> <sql-query opt-roles="2,3,4"> <select>...</select> <select>...</select> <select>...</select> <select>...</select> </sql-query> <sql-query opt-roles="2,3,4"> <select>...</select> <select>...</select> <select>...</select> <select>...</select> </sql-query> <action> Kdesi (hluboko) v těle akce se vyskytne opt-roles="5,6,7" </action> </request>
Příklad 3 (zde ke změně role nedochází)
<request> <sql-query opt-roles="2,3,4"> <select>...</select> <select>...</select> <select>...</select> <select>...</select> </sql-query> <do-action opt-roles="5,6,7">...</do-action> <sql-query opt-roles="2,3,4"> <select>...</select> <select>...</select> <select>...</select> <select>...</select> </sql-query> </request>