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:
<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 ocontent,structure,storage, nebomacro.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 jakocom.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ítrequireRole- 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
aclv 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řístupurequireRole,requireGroup- je kontrolováno společně, postačí členství ve skupině nebo přiřazená role pro povolení přístupuacl,dcl- vyhodnoceno společně, musí být splněna podmínka, žeaclpovoluje přístup adclneznemožňuje přístup, a nelze specifikovat pouzedcl, 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:
boolean isAllowedToView()boolean isAllowedToAdd() boolean isAllowedToChange() boolean isAllowedToDelete() boolean isAllowedToExecute() boolean isAllowedToOrganize() boolean isAllowedToValidate() boolean isAllowedToPublish()Pří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
<metadata> <security> <acl>C</acl> <module>content</module> <identifier>#lookup[pageIdBySourceId]#</identifier> </security></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)
<metadata> <security> <acl>A</acl> <identifier>templates</identifier> <subIdentifier>#lookup[clientTemplateSuperTemplate].templateId#</subIdentifier> </security></metadata>Požadováno oprávnění pro mazání (DELETE), ale nesmí současně právo organizovat (ORGANIZE)
<removeButton id="remove"> <metadata> <security> <acl>D</acl> <dcl>O</dcl> <identifier>users</identifier> </security> </metadata> <command class="com.fg.edee.security.web.command.RemoveUserCommand"/></removeButton>Požadavek oprávnění vůči objektu specifikovanému pomocí identifierObject
<treeMenuItem id="trashPage" urlToIdentify="/edee/others/edeeService?eventName.trashPage=&rootId=[#record[].id!#]"> <metadata> <iconClass>icon-edee-delete icon-red</iconClass> <target>ajaxCall</target> <confirmRequired/> <itemSecurity> <acl>D</acl> <module>structure</module> <identifierObject>#record[]!#</identifierObject> </itemSecurity> </metadata></treeMenuItem>Ukázka využití ACL v resolver objektu ve widget state (condition je dostupná pro type pageUrl)
<baseMotive extends="textInput" > <metadata> <security> <module>storage</module> <identifier>f.file</identifier> <subIdentifier>#@widgetData[]!#</subIdentifier> </security> <dataset defaultMode="combine"> <decorator>MotiveSelect</decorator> <editUrl condition="isTrue(#@widgetState[].data[acl].allowedToView#)" type="pageUrl">/edee/metadata/metadataEditor</editUrl> <imageCrop> <cropUrl condition="isTrue(#@widgetState[].data[acl].allowedToChange#)" type="pageUrl">/edee/others/edeeService?eventName.storageImageSaveCommand=</cropUrl> <previewUrl condition="isTrue(#@widgetState[].data[acl].allowedToView#)" type="pageUrl">/edee/others/edeeService?eventName.storageImagePreviewCommand=</previewUrl> </imageCrop> </dataset> </metadata></baseMotive>Security 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.
