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:

xml
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

xml
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)

xml
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)

xml
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

xml
1 <treeMenuItem id="trashPage" urlToIdentify="/edee/others/edeeService?eventName.trashPage=&amp;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)

xml
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.