Specifikace autorizačních požadavků
Specifikace autorizačních požadavků
Každá stránka musí mít definována požadovaná oprávnění, tj. autorizaci potřebnou pro její zpřístupnění. Kromě celé stránky, lze specifikovat tyto požadavky na jednotlivé komponenty - např. tlačítka, takže tlačítko pro mazání lze zpřístupnit pouze uživateli s oprávněním DELETE.
Kontrola oprávnění se provádí pomocí interceptoru:
1 <interceptor type="securityInterceptor"/>Interceptor pracuje s informacemi na úrovni metadata/security. Nastavení security metadat se žádným způsobem NEdědí, tj. nastavení na stránce se nijak nepřenáší na jednotlivé widgety, nebo podstránky.
Uvnitř lze využít následující značky:
- module - název tzv. security modulu (standardně odpovídá názvu modulu v sitemap, resp. se odvozuje ze security descriptoru) vůči kterému jsou práva kontrolována. Tento element není povinný, implicitně se vyhodnocuje podle toho, v jakém modulu GUI sídlí. Je nutné specifikovat pro systémové security moduly, jedná se o content, structure, storage, nebo macro.
- identifier / Security Identifier - identifikátor entity vůči které jsou práva kontrolována. Pro každý modul může mít tedy stejný identifier různý význam.
- subIdentifier - identifikátor vnořené entity, pokud to v daném kontextu dává význam. Např. pro soubory v úložišti odpovídá identifier objektu úložiště a subIdentifier objektu souboru nebo složky. V případě stránek je identifier stránka. Je-li stránka seznamem, pak její položky jsou reprezentovány jako subIdentifier.
- identifierObject - pokud stránka pracuje přímo s objekty reprezentovatelnými jako com.fg.webapp.cps.v1.core.security.SecurityIdentifier, pak lze pomocí rjel výrazu (lookup) specifikovat přímo tento objekt, bez nutnosti neoptimálního překladu na id a zpět.
- acl / Access Control List - seznam práv, jaká uživatel musí mít. Jednotlivá práva v těchto elementech musí být oddělena mezerou, čárkou nebo středníkem, např.: A,D. Více na stránce o konfiguraci rolí
- dcl / Deny Control List - seznam práv, jaká uživatel nesmí mít
- requireRole - název role (především využitelné pro volné role), kterou uživatel musí mít pro zobrazení.
- denyRole - název role (především využitelné pro volné role), kterou uživatel nesmí mít pro zobrazení.
- requireGroup - název skupiny, kterou uživatel musí mít pro zobrazení.
- denyGroup - název skupiny, kterou uživatel nesmí mít pro zobrazení.
Pokud není specifikováno žádné omezení oprávnění (jedna ze značek acl, dcl, requireRole, denyRole, requireGroup, denyGroup) pak je:
- pro stránku zakázan přístup vždy
- pro widget je přístup povolen, je pouze provedeno vyhodnocení ACL uživatele a výsledek je uložen ve state datech pod klíčem acl v podobě resolver objektu, viz dále.
Pokud jsou omezení specifikována, je kontrola provedena v pořadí:
- denyRole, denyGroup - je kontrolováno společně, postačí členství ve skupině nebo přiřazená role pro odmítnutí přístupu
- requireRole, requireGroup - je kontrolováno společně, postačí členství ve skupině nebo přiřazená role pro povolení přístupu
- acl, dcl - vyhodnoceno společně, musí být splněna podmínka, že acl povoluje přístup a dcl neznemožňuje přístup, a nelze specifikovat pouze dcl, jinak je přístup vždy zamítnut
Pokud není udělen přístup na úrovni stránky dojde k vynucení přesměrování na chybovou stánku "přístup zamítnut". Pro widget je pak nastaven jeho stav na accessible=false, widget ve stránce vykreslen.
Výsledek vyhodnocení pomocí acl/dcl je uložen v podobě resolver objektu, na který se lze odkazovat pomocí condition na jednu z metod:
1 boolean isAllowedToView()2boolean isAllowedToAdd() 3boolean isAllowedToChange() 4boolean isAllowedToDelete() 5boolean isAllowedToExecute() 6boolean isAllowedToOrganize() 7boolean isAllowedToValidate() 8boolean isAllowedToPublish()
Zkopírovat odkaz na sekciPříklady:
Požadavek na právo editovat (CHANGE) v rámci systémového modulu content (obsah) pro stránku dle id vyhodnocené z lookup
1 <metadata>2 <security>3 <acl>C</acl>4 <module>content</module>5 <identifier>#lookup[pageIdBySourceId]#</identifier>6 </security>7</metadata>
Požadováno právo přidávání (ADD) položek v rámci aktuálního modulu (zde mail) a části šablon (template)
1 <metadata>2 <security>3 <acl>A</acl>4 <identifier>templates</identifier>5 <subIdentifier>#lookup[clientTemplateSuperTemplate].templateId#</subIdentifier>6 </security>7</metadata>
Požadováno oprávnění pro mazání (DELETE), ale nesmí současně právo organizovat (ORGANIZE)
1 <removeButton id="remove">2 <metadata>3 <security>4 <acl>D</acl>5 <dcl>O</dcl>6 <identifier>users</identifier>7 </security>8 </metadata>9 <command class="com.fg.edee.security.web.command.RemoveUserCommand"/>10</removeButton>
Požadavek oprávnění vůči objektu specifikovanému pomocí identifierObject
1 <treeMenuItem id="trashPage" urlToIdentify="/edee/others/edeeService?eventName.trashPage=&rootId=[#record[].id!#]">2 <metadata>3 <iconClass>icon-edee-delete icon-red</iconClass>4 <target>ajaxCall</target>5 <confirmRequired/>6 <itemSecurity>7 <acl>D</acl>8 <module>structure</module>9 <identifierObject>#record[]!#</identifierObject>10 </itemSecurity>11 </metadata>12</treeMenuItem>
Ukázka využití ACL v resolver objektu ve widget state (condition je dostupná pro type pageUrl)
1 <baseMotive extends="textInput" >2 <metadata>3 <security>4 <module>storage</module>5 <identifier>f.file</identifier>6 <subIdentifier>#@widgetData[]!#</subIdentifier>7 </security>8 <dataset defaultMode="combine">9 <decorator>MotiveSelect</decorator>10 <editUrl condition="isTrue(#@widgetState[].data[acl].allowedToView#)"11 type="pageUrl">/edee/metadata/metadataEditor</editUrl>12 <imageCrop>13 <cropUrl condition="isTrue(#@widgetState[].data[acl].allowedToChange#)"14 type="pageUrl">/edee/others/edeeService?eventName.storageImageSaveCommand=</cropUrl>15 <previewUrl condition="isTrue(#@widgetState[].data[acl].allowedToView#)"16 type="pageUrl">/edee/others/edeeService?eventName.storageImagePreviewCommand=</previewUrl>17 </imageCrop>18 </dataset>19 </metadata>20</baseMotive>
Zkopírovat odkaz na sekciSecurity model pro moduly
Každý modul by měl specifikovat vlastní strukturu objektů na které lze cílit oprávnění a jsou využitelné pro dědičnost oprávnění. Struktura je definovnána pomocí ModuleDescriptor/TreeDescriptor API.