## Algoritmus pro získání rolí z množiny uživatel x oprávnění Výsledkem tohoto algoritmu je množina rolí R, ve které jsou extrahovány optimální role s výčtem uživatelů, kteří tuto roli vlastní a společně s oprávněnými, která tato role má. Krom těchto rolí, je výsledkem i množina zbytkových oprávnění, společně se seznamem uživatelů. Algoritmus: - vstupní parametry : * k = nejmenší počet oprávnění v roli * n = minimální počet uživatelů vlastnící roli * z = optimální velikost role * množina uživatel x oprávění [0,1] *(binární matrix)* #### Postup algoritmu 1 ) Extrakce všech možných rolí **Pro všechny uživatele v úplném binárním matrixu:** * Vyber všechna jejich oprávnění * Má uživatel méně oprávnění než **k** ? * ulož všechny uživatelova oprávnění jako **zbytková oprávnění**¨ * přidej uživatele ke každému zbytkovému oprávnění * přejdi na dalšího uživatele * Ulož oprávnění do množiny **oprávnění na zpracování** * PRO VŠECHNA oprávnění v množině **oprávnění na zpracování** * Vyber počet oprávnění větší než **k** * aplikace algoritmu kombinací * u daných kombinací nezáleží na pořadí * je nutné mít všechny kombinace > k * http://stackoverflow.com/a/29914908 * Nejsou tyto oprávnění ještě v množině **ROLE**? * ulož novou Roli Rx do množiny **ROLE** * přidej této roli Rx všechna oprávnění * JINAK * vyber roli, která má shodné oprávnění role * přičti jedničku k proměné **počet uživatelů vlastnící tuto roli** * přidej uživatele k této roli do proměnné **uživatelé role** 2) Seřaď ROLE podle kritérí sestupně - **Kritérium: velikost role** - v porovnání role, zvýhodni role, které mají nejbližší odstup od optimální velikosti role - **absolutní hodnota (počet oprávnění - optimální počet oprávnění)** - **Kritérum: počet uživatelů** - v porovnání role, zvýhodi role, které mají vyšší počet uživatelů *Díky tomuto setřídění, lze iterovat role a postupně odebírat, jelikož vrchní role mají větší důležitost, než role následující.* 3) PRO VŠECHNY ROLE - Existuje už role se stejnými oprávněnmi? - Odeber tuto roli - existuje už role, která je podřazená nebo nadřazená aktuální roli? - lze z aktuální role oddělit roli podřazenou či nadřazenou? - budou obě role vyhovovat providlu >= než **k**? - POKUD ANO - **proveď rozdělení rolí** * přidej všem uživatelům nadřazené role, roli podřazenou * přidej všem uživatelům podřazené role, roli nadřazenou * odeber oprávnění role podřazené z role nadřazené * **Znovu setřiď role** * *Rozdělením role se mohla porušit hiearchie rolí, proto je potřeba role znovu setřídit a znovu projít.* - obsahuje role některé oprávnění z aktuální role? - má tato role stejné uživatele, jako testovaná role? - **tato role je duplicitní, odeber tuto roli.**