Změna oprávnění uživatele

Přímá změna oprávnění, tedy přímé přidání/úprava/smazání vazby mezi identitou a rolí (přes REST api) není možné. Veškeré změny oprávnění je možné provádět přes agendu žádostí o role (RoleRequest).

Tato agenda obsahuje všechny žádosti (přání) o požadovaných změnách oprávnění identit. Základní myšlenkou je, že všechny změny v oprávnění identit, musí jít vždy přes tuto agendu. Není určena tedy pouze pro žádosti koncových uživatelů, ale i pro automatické operace (synchronizace, automatické role, …).

Standardní scénář změny oprávnění je následující:

  1. Uživatel požaduje změnu svých oprávnění.
  2. Na záložce "Přiřazené role" stiskne tlačítko "Změnit oprávnění".
  3. Automaticky je vytvořena nová žádost (ve stavu "CONCEPT"). Uživateli je zobrazen detail této nové žádosti.
  4. V tabulce konceptů "Aktuálně přiřazené role (včetně požadovaných změn)", jsou zobrazeny všechny role, které má uživatel přiřazené. Nad touto tabulkou může uživatel provést požadované změny (více viz. Koncept tabulka).
  5. Všechny požadované úpravy oprávnění jsou zobrazeny v tabulce "Požadované změny oprávnění".
  6. Uživatel stiskne tlačítko "Podat žádost".
  7. Pokud není vyhodnocena žádost jako duplicitní, je provedeno její spuštění (nastaven stav "IN_PROGRESS").
  8. Následně je vyvolána událost "RoleRequestEventType.EXCECUTE".
  9. Standardně je tato událost nejdříve zachycena procesorem "role-request-approval-processor", který spustí workflow schvalování (zavolá metodu IdmRoleRequestService.startApprovalProcess). Ve výchozím stavuje spuštěno workflow s definicí "approve-identity-change-permissions". Klíč definice, která bude spouštěna, je možné změnit v konfiguraci aplikace přidáním klíče "idm.sec.core.processor.role-request-approval-processor.wf", (hodnotou bude klíč požadované definice).
  10. Po úspěšném schválení vyvolá workflow proces znovu událost "RoleRequestEventType.EXCECUTE" (pokračuje s událostí, se kterou byl spuštěn).
  11. Standardně bude událost zachycena procesorem "role-request-realization-processor", který zajišťuje samotnou realizaci žádosti. Procesor zavolá metodu IdmRoleRequestService.executeRequest(requestId), která provede aplikování všech konceptů rolí, které jsou ve stavu "APPROVED" nebo "CONCEPT" (stav koncept je realizován, kvůli situaci, kdy je realizační procesor vyvolán ihned po podání žádosti, tzn. je vypnuté schvalování).
  12. Uživatel má přidělené role, dle požadovaných změn.
Pokud uživatel vytvoří novou žádost, ale neprovede její podání, zobrazí se mu jako "Koncept" v tabulce "Rozpracované žádosti o změnu oprávnění" na záložce přiřazených rolí. Může se tak vrátit k rozpracovanému konceptu.

Koncept tabulka

Cílem je, uživateli umožnit komfortní vytvoření požadovaných změn oprávnění (vidí všechny změny na jednom místě, promítnuté do jeho aktuálně přiřazených rolí).

  • Vstupním parametrem koncept tabulky, je seznam všech aktuálně přiřazených rolí uživatele (ty nejsou označeny žádnou barvou).
  • Pokud uživatel přidá nové oprávnění (role + data platností), zobrazí se v tabulce jako nové řádky (označené zelenou barvou).
  • Pokud uživatel odebere oprávnění z tabulky nezmizí, ale pouze se jim změní stav (označené červenou barvou).
  • Pokud uživatel upraví oprávnění (v současné chvíli je možné měnit pouze datum platnosti od/do), tak se oprávnění zobrazí oranžovou barvou. Tooltip nad upravenou buňkou zobrazí původní hodnotu.
  • Všechny úpravy je možné z koncepční tabulky odebrat (změny, zrušení odebrání, smazání přidaných nových oprávnění).
Podání žádosti, je možné pouze pokud je žádost ve stavu "CONCEPT", "DUPLICATED", "EXCEPTION"

Změna oprávnění bez schválení

Existují dva způsoby, jak provést změnu oprávnění bez jejich schvalování.

Vypnutí schvalovacího procesoru

Jak již bylo zmíněno, je po podání žádosti vyvolána událost, kterou odchytí procesor "role-request-approval-processor". Pokud tento procesor vypneme, budou všechny podané žádosti ihned zrealizovány a to bez jakéhokoli schvalování.

Vypnutím schvalovacího procesoru, budou ihned realizovány všechny podané žádosti a to pro všechny uživatele v systému. Bez ohledu na jejich oprávnění.

Atribut žádosti "Provést ihned"

Žádost o změnu oprávnění, obsahuje atribut "executeImmediately". Pokud tento atribut nastavíme na "true", bude žádost provedena ihned po jejím podání. Podání bez schválení, mohou spustit pouze uživatelé mající oprávnění "ROLEREQUEST_EXECUTEIMMEDIATELY". Pokud se pokusí spustit takto označenou žádost, uživatel bez tohoto oprávnění, pak bude vyvolána výjimka.

Programově je možné provést podání žádosti bez schvalování i bez nutnosti mít požadované oprávnění. K tomuto účelu slouží metoda "IdmRoleRequestService.startRequestInternal". Tato metoda není dostupná přes REST rozhraní.

Duplicitní žádost

Během procesu podání žádosti, je ověřeno zdali k nové žádosti neexistuje jiná duplicitní žádost (ve stavu "IN_PROGRESS", "APPROVED"). Pokud je nalezena duplicitní žádost, je spouštěná žádost označena jako duplicitní (stav "DUPLICATED") a její atribut "duplicatedToRequest" je naplněn identifikátorem duplicitní žádosti (je proveden záznam do logu žádosti). Podání (spuštění) žádosti je tím přerušeno.

Duplicitní žádost je taková, která má ekvivalentní všechny:

  • Žadatele.
  • Jednotlivé koncepty rolí (stejný typ role, stejné platnosti od/do, stejná vazba IdentityRole).
  • Poznámku žádosti (uživatel může definovat svůj požadavek pouze v této poznámce).
Duplicitní žádost, je možné opakovaně podat (spustit). Tím se znovu provede dohledání duplicitních žádostí.

Odstranění žádosti

Žádost je možné zcela smazat pouze pokud je ve stavu "CONCEPT". Pokud je ve stavu "EXECUTED", tak je každý pokus o smazání ukončen výjimkou "ROLE_REQUEST_EXECUTED_CANNOT_DELETE". Pokud je ve stavech "APPROVED, IN_PROGRESS, EXCEPTION, DUPLICATED", tak je žádosti nastaven stav "CANCELED". Pokud je na žádost navázán nějaký proces, je tento proces ukončen (následně je o tom proveden zápis do logu žádosti).

Agenda žádostí pro administrátora

Výše byla popsána situace, kdy si žádost o změnu oprávnění vytváří koncový uživatel ze svého profilu. Pro administrátory je vhodné využít agendu "Žádostí o role", která umožňuje přehled všech žádostí v systému. V této agendě jsou zobrazeny všechny žádosti ve všech stavech (včetně již provedených).

Agenda umožňuje podání žádosti přímo ze seznamu žádostí. Dále agenda umožňuje vytvoření nové žádosti, kdy v prvním kroku musí administrátor vybrat uživatele pro kterého žádost vytváří.

Detail žádosti v této agendě obsahuje navíc (na rozdíl od detailu žádosti koncového uživatele) možnost zaškrtnutí, že nemá být žádost schvalovaná. Dále detail žádosti obsahuje log. Tento log obsahuje všechny zásadní informace, které se vyskytnou, během životního cyklu žádosti (chyby, duplicity, zrušení žádosti z důvodu integrity, provedené operace, …).

Vytvoření žádosti přes REST rozhraní má následující kroky:

  1. Vytvoření žádosti
  2. Vytvoření konceptů rolí (požadované změny oprávnění)
  3. Start žádosti (podání žádosti)

Vytvoření žádosti

Žádost je možné vytvořit prostřednictvím metody POST na endpointu "/api/v1/role-requests/".

Příklad requestu:

{
  "applicant" : "846164b4-8272-46a7-ba69-0bfdad652aff",
  "requestedByType" : "MANUALLY",
  "conceptRoles" : [],
  "executeImmediately" : false,
  "description" : "Prosím o kontrolu a schválení změny oprávnění"
}

Vytvoření konceptů rolí

Koncept role je možné vytvořit prostřednictvím metody POST na endpointu "/api/v1/concept-role-requests/".

Příklad requestu (vytvoření konceptu, pro přiřazení nové role):

{
 "roleRequest":"740d7dc3-d90b-40cd-80f9-80cf36180c80",
 "identityContract":"7fdf1128-ce2d-4d34-ba99-821a544ad753",
 "role":"6ac36596-4f68-4282-88de-685e654199d6",
 "identityRole":null,
 "roleTreeNode":null,
 "validFrom":null,
 "validTill":"2017-07-31",
 "operation":"ADD"
}

Spuštění žádosti

Spuštění žádosti je možné provést prostřednictvím metody PUT na endpointu "/api/v1/role-requests/{requestId}/start", kde requestId je UUID vytvořené žádosti.

Během procesu schvalování, může dojít ke změně požadovaných změn (například vedoucí nesouhlasí s přiřazením dané role a proto jí ze žádosti odstraní). Aby bylo jednoduše zpětně dohledatelné, jak vypadala originální žádost, je při procesu jejího startu převedena do formátu JSON a uložena do žádosti (atribut originalRequest). Z důvodu přehlednosti, není tento atribut uveden v příkladu níže.

Příklad response (žádost ve stavu IN_PROGRESS):

{
   "id": "740d7dc3-d90b-40cd-80f9-80cf36180c80",
   "created": "2017-03-22T08:57:03.385Z",
   "modified": "2017-03-22T09:12:45.617Z",
   "creator": "admin",
   "creatorId": "0e49f109-cdc0-495f-b69a-2456fd2ced54",
   "modifier": "admin",
   "modifierId": "0e49f109-cdc0-495f-b69a-2456fd2ced54",
   "originalCreator": "admin",
   "originalCreatorId": "0e49f109-cdc0-495f-b69a-2456fd2ced54",
   "originalModifier": "admin",
   "originalModifierId": "0e49f109-cdc0-495f-b69a-2456fd2ced54",
   "trimmed": false,
   "applicant": "846164b4-8272-46a7-ba69-0bfdad652aff",
   "state": "IN_PROGRESS",
   "requestedByType": "MANUALLY",
   "wfProcessId": "2621",
   "conceptRoles": [   {
      "id": "974f0941-20e8-44ff-b387-425460ee2546",
      "created": "2017-03-22T09:07:37.189Z",
      "modified": null,
      "creator": "admin",
      "creatorId": "0e49f109-cdc0-495f-b69a-2456fd2ced54",
      "modifier": null,
      "modifierId": null,
      "originalCreator": "admin",
      "originalCreatorId": "0e49f109-cdc0-495f-b69a-2456fd2ced54",
      "originalModifier": null,
      "originalModifierId": null,
      "trimmed": true,
      "roleRequest": "740d7dc3-d90b-40cd-80f9-80cf36180c80",
      "identityContract": "7fdf1128-ce2d-4d34-ba99-821a544ad753",
      "role": "6ac36596-4f68-4282-88de-685e654199d6",
      "identityRole": null,
      "roleTreeNode": null,
      "validFrom": null,
      "validTill": "2017-07-31",
      "operation": "ADD",
      "state": "CONCEPT",
      "wfProcessId": null,
      "log": null,
      "_embedded":       {
         "identityContract":          {
            "id": "7fdf1128-ce2d-4d34-ba99-821a544ad753",
            "created": "2017-03-21T14:10:59.496Z",
            "modified": null,
            "creator": "[SYSTEM]",
            "creatorId": null,
            "modifier": null,
            "modifierId": null,
            "originalCreator": "[SYSTEM]",
            "originalCreatorId": null,
            "originalModifier": null,
            "originalModifierId": null,
            "trimmed": true,
            "identity": "846164b4-8272-46a7-ba69-0bfdad652aff",
            "validFrom": null,
            "validTill": null,
            "guarantee": null,
            "position": "Default",
            "externe": false,
            "disabled": false,
            "_embedded": {"identity":             {
               "id": "846164b4-8272-46a7-ba69-0bfdad652aff",
               "created": "2017-03-21T14:10:59.071Z",
               "modified": null,
               "creator": "[SYSTEM]",
               "creatorId": null,
               "modifier": null,
               "modifierId": null,
               "originalCreator": "[SYSTEM]",
               "originalCreatorId": null,
               "originalModifier": null,
               "originalModifierId": null,
               "trimmed": true,
               "username": "kopr",
               "_embedded": {}
            }}
         },
         "role":          {
            "id": "6ac36596-4f68-4282-88de-685e654199d6",
            "created": "2017-03-21T14:10:54.859Z",
            "modified": null,
            "creator": "[SYSTEM]",
            "creatorId": null,
            "modifier": null,
            "modifierId": null,
            "originalCreator": "[SYSTEM]",
            "originalCreatorId": null,
            "originalModifier": null,
            "originalModifierId": null,
            "trimmed": true,
            "name": "superAdminRole",
            "disabled": false,
            "version": null,
            "roleType": "SYSTEM",
            "priority": 0,
            "approveAddWorkflow": "approveRoleBySuperAdminRole",
            "approveRemoveWorkflow": "approveRemoveRoleBySuperAdminRole",
            "description": null,
            "subRoles": null,
            "superiorRoles": null,
            "authorities": null,
            "_embedded": {}
         },
         "roleRequest":          {
            "id": "740d7dc3-d90b-40cd-80f9-80cf36180c80",
            "created": "2017-03-22T08:57:03.385Z",
            "modified": "2017-03-22T09:12:45.617Z",
            "creator": "admin",
            "creatorId": "0e49f109-cdc0-495f-b69a-2456fd2ced54",
            "modifier": "admin",
            "modifierId": "0e49f109-cdc0-495f-b69a-2456fd2ced54",
            "originalCreator": "admin",
            "originalCreatorId": "0e49f109-cdc0-495f-b69a-2456fd2ced54",
            "originalModifier": "admin",
            "originalModifierId": "0e49f109-cdc0-495f-b69a-2456fd2ced54",
            "trimmed": true,
            "applicant": "846164b4-8272-46a7-ba69-0bfdad652aff",
            "state": "IN_PROGRESS",
            "requestedByType": "MANUALLY",
            "wfProcessId": "2621",
            "conceptRoles": [],
            "executeImmediately": false,
            "duplicatedToRequest": null,
            "log": null,
            "description": "Prosím o kontrolu a schválení změny oprávnění",
            "_embedded": {"applicant":             {
               "id": "846164b4-8272-46a7-ba69-0bfdad652aff",
               "created": "2017-03-21T14:10:59.071Z",
               "modified": null,
               "creator": "[SYSTEM]",
               "creatorId": null,
               "modifier": null,
               "modifierId": null,
               "originalCreator": "[SYSTEM]",
               "originalCreatorId": null,
               "originalModifier": null,
               "originalModifierId": null,
               "trimmed": true,
               "username": "kopr",
               "_embedded": {}
            }}
         }
      }
   }],
   "executeImmediately": false,
   "duplicatedToRequest": null,
   "log": null,
   "description": "Prosím o kontrolu a schválení změny oprávnění",
   "_embedded":    {
      "wfProcessId":       {
         "processDefinitionId": "approve-identity-change-permissions:1:36",
         "id": "2642",
         "name": "Approve by manager",
         "startTime": "2017-03-22T09:12:45.569+0000",
         "endTime": null,
         "durationInMillis": null,
         "startUserId": null,
         "deleteReason": null,
         "priority": 50,
         "assignee": null,
         "createTime": "2017-03-22T09:12:45.569+0000",
         "dueDate": null,
         "completeTaskDecision": null,
         "taskVariables": {},
         "candicateUsers":          [
            "admin",
            "svanda",
            "kopr"
         ]
      },
      "applicant":       {
         "id": "846164b4-8272-46a7-ba69-0bfdad652aff",
         "created": "2017-03-21T14:10:59.071Z",
         "modified": null,
         "creator": "[SYSTEM]",
         "creatorId": null,
         "modifier": null,
         "modifierId": null,
         "originalCreator": "[SYSTEM]",
         "originalCreatorId": null,
         "originalModifier": null,
         "originalModifierId": null,
         "trimmed": true,
         "username": "kopr",
         "_embedded": {}
      }
   },
   "_links": {"self": {"href": "http://localhost:8080/idm-backend/api/v1/role-requests/740d7dc3-d90b-40cd-80f9-80cf36180c80"}}
}

Schvalovací proces

Pokud nepoužijeme režim žádosti o změnu oprávnění bez schvalování, bude nastartován proces "approve-identity-change-permissions". Tento proces má na starosti schválení žádosti jako celku a jeho základní implementace se skládá z těchto částí:

  1. Generování názvu procesu (v názvu bude uvedeno i jméno žadatele)
  2. Schválení helpdesk oddělením.
  3. Schválení vedoucím žadatele.
  4. Schválení oddělením správy uživatelů.
  5. Spuštění pod procesů pro každou požadovanou roli.
  6. Schválení bezpečnostním oddělením.
  7. Odeslání notifikace.
  8. Realizace žádosti - samotná realizace není prováděna procesem, ale službou pro správu žádosti o změnu oprávnění.
Vstupem procesu je událost, která schvalování vyvolala. Tato událost obsahuje samotnou žádost (IdmRoleRequestDto). Na konci procesu, je tato událost opět vyvolána (provede realizaci).

Schválení helpdesk oddělením

  • Schvalovací úkol bude přidělen všem uživatelům, kteří budou mít roli Helpdesk.
  • Roli je možné změnit v konfiguraci aplikace "idm.sec.core.wf.approval.helpdesk.role", výchozí nastavení je Helpdesk.
  • Schvalovací kolo je možné povolit, či zakázat v konfiguraci aplikace pod klíčem "idm.sec.core.wf.approval.helpdesk.enabled".
Ve výchozím stavuje je "helpdesk" schvalování vypnuté

.

Schválení vedoucím

  • Schvalovací úkol bude přidělen všem uživatelům, vyhodnoceni jako vedoucí žadatele. Vedoucí je definován na základě pracovních vztahů žadatele.
  • Schvalovací kolo je možné povolit, či zakázat v konfiguraci aplikace pod klíčem "idm.sec.core.wf.approval.manager.enabled".
Ve výchozím stavuje je schvalování vedoucím vypnuté

.

Schválení oddělením správy uživatelů

  • Schvalovací úkol bude přidělen všem uživatelům, kteří budou mít roli Usermanager.
  • Roli je možné změnit v konfiguraci aplikace "idm.sec.core.wf.approval.usermanager.role", výchozí nastavení je Usermanager.
  • Schvalovací kolo je možné povolit, či zakázat v konfiguraci aplikace pod klíčem "idm.sec.core.wf.approval.usermanager.enabled".
Ve výchozím stavuje je schvalování oddělením správy uživatelů vypnuté

.

Spuštění schvalovacích podprocesů

Každá dílčí role o kterou je žádáno (změna, či přiřazení), může být samostatně schvalována. Proto je pro každou roli spuštěn vždy samostatný podproces.

Pokud je vyhodnoceno, že daná role nevyžaduje schvalování, je spuštěn výchozí proces "change-role-without-approve". Úkolem tohoto procesu je pouze vygenerování příslušného názvu (je uloženo v historii workflow procesů) a změna stavu daného konceptu role na "APPROVED".

Nastavení schvalovacího procesu roli

Schvalovací proces (pro přiřazení, či změnu přiřazené role) nastavíme dané roli tak, že jí nastavíme příslušnou prioritu. Priorita role může nabývá hodnot (0,1,2,3,4), kde každá priorita může mít přiřazen jiný schvalovací proces.

Konkrétní přiřazení priority a typu schvalovacího procesu, je definováno v aplikační konfiguraci:

idm.sec.core.wf.role.approval.{priority}={wf}

,kde {priority} je číslo priority a {wf} je klíč workflow procesu.

Proces schvalující odebrání přiřazené role, je pro celou aplikaci (všechny priority) pouze jeden. Definovat je ho možné opět v konfiguraci aplikace a to pod klíčem "idm.sec.core.wf.role.approval.remove". Výchozí proces je "approve-remove-role-by-manager"
Aby bylo odebrání role schvalované, je nutné aby na samotné roli byla zaškrtnuta položka "Schvalovat odebírání rolí".

Výchozí nastavení priorit a schvalovacích procesů je následující:

  • Žádná priorita (0):

Žádné schvalování neprobíhá. Je spuštěn proces "change-role-without-approve", popsaný výše.

  • Triviální priorita (1):

Schvalování vedoucím žadatele "approve-role-by-manager".

  • Malá priorita (2):

Schvalování garantem dané role "approve-role-by-guarantee".

* Velká priorita (3): Schvalování garantem dané role a bezpečnostním oddělením "approve-role-by-guarantee".

Schválení oddělením bezpečnosti

  • Schvalovací úkol bude přidělen všem uživatelům, kteří budou mít roli Security.
  • Roli je možné změnit v konfiguraci aplikace "idm.sec.core.wf.approval.security.role", výchozí nastavení je Security.
  • Schvalovací kolo je možné povolit, či zakázat v konfiguraci aplikace pod klíčem "idm.sec.core.wf.approval.security.enabled".
Ve výchozím stavuje je schvalování oddělením bezpečnosti vypnuté

.

Automatické přeskočení schvalovacích úkolu

Automatické přeskočení schvalovacích úkolů je provedeno, pokud je realizátor žádosti (ten kdo jí skutečně podal) stejný uživatel, jako ten který je aktuálně přihlášený a zároveň je mezi kandidáty, kteří mohou tento úkol schválit. V takové případě je úkol přeskočen a to se stejným výsledkem, jako by ho ručně schválil.