Archiv pro rubriku: Programování

Nové GUI pro správu rolí

S nedávno vydaným releasem CzechIdM 2016q1 přichází nejen řada nových a zajímavých funkcí, ale i několik změn v GUI. Tou nejvýraznější z nich je nový, uživatelsky přívětivější formulář pro vytváření a editaci rolí. Jelikož se řada nových funkcí týká právě rolí a práce s nimi, přibylo do již tak poměrně nepřehledného editačního formuláře mnoho nových konfiguračních políček. Právě proto vyvstala potřeba formulář přepracovat. Continue reading

Prezentace novinky v release 2016q1 část 1

V rámci interních školení jsem pro kolegy uspořádal první část prezentace představující nové funkčnosti IdM vydané v novém releasu s názvem Release 2016q1. Po delší době jde o nový release vydaný veřejně a přináší spoustu vylepšení pro další zlepšení a zjednodušení identity managementu. Jaká témata jsme v prezentaci probírali se dozvíte z agendy níže.

Continue reading

Do CzechIdM umíme připojit eSpis

U našeho zákazníka jsme pomocí CzechIdM plně nahradili standardní grafické rozhraní pro správu eSpisu. Napojením eSpisu k CzechIdM umožňujeme našim zákazníkům  ruční správu jednotlivých entit v eSpisu, stejně tak jako plnou integraci se stávajícími systémy v organizaci. Napojení je realizováno tak, že CzechIdM v eSpisu spravuje:

  • organizační útvary,
  • funkční místa,
  • uživatelské účty a jejich vazby na další entity.

V tomto článku si ukážeme, jak jsme se poprali s grafickou formou rozhraní pro správu jednotlivých entit. Continue reading

Prezentace Scala vs. Java 8

V rámci interních školení u nás proběhla prezentace představující programovací jazyk Scala a porovnávající jej s jazykem Java ve verzi 8. Scala je programovací jazyk kompatibilní s Javou, který v sobě kombinuje objektově orientované a funkcionální programování. Tento jazyk, navržený v roce 2003 Martinem Oderskym, německým počítačovým vědcem působícím ve Švýcarsku, se vyznačuje několika zajímavými vlastnostmi jako jsou pattern matching, duck typing či anonymní funkce. Právě posledně jmenované Anonymní funkce přinesla i Java 8 v podobě lambda výrazů.

Continue reading

CzechPAM: Schvalovací úkoly a úprava dat

Náš nový produkt CzechPAM pomáhá při správě privilegovaných účtů. Má mnoho skvělých vlastností. Jednou z nich je možnost, aby vytvořené úkoly, například přidání uživatele do nějaké skupiny, schvalovali určení uživatelé. Tato vlastnost CzechPAM přidává důležitou kostičku do promyšleného bezpečnostního mechanismu našeho produktu. O tom, jak jsme schvalovací úkoly přenesli do CzechPAM, se dozvíte dále v článku.

Continue reading

CzechIdM Roadmap 2015

Každý větší software musí mít nejakou vizi, cíl, kam chce směřovat. Bez vize je jeho vývoj pouze nabalující se sněhovou koulí. Vývoj běží na úrovni implementace vlastní setrvačností. V začátcích nám samovolný vývoj nevadí, ale v momentě, kdy aplikace dosáhne určitého rozsahu, je takový způsob práce dále neudržitelný.

S příchodem roku 2015 jsme tedy i my formalizovali naši vizi a vytvořili pro CzechIdM Roadmapu.
CzechIdM je ve vývoji již zhruba pět let, což je relativně dlouho. Většina vývoje je přizpůsobování produktu na míru konkrétnímu zákazníkovi. Dostatečně obecné (a užitečné) funkcionality jsou zároveň zařazovány do standardního produktu. Vývoj je tedy z větší části řízen poptávkou po konkrétních funkcionalitách, z části menší pak vývojem vlastních features „do šuplíku“.

Continue reading

Jarní osvěžení s Mockitem

Zima už je, zdá se, definitivně za námi, a tak, stejně jako budeme v následujících dnech a měsících postupně odkládat všechny ty těžké bundy a kabáty,  můžeme odhodit všechno to „heavyweight“ programování a ulehčit si psaní testů s testovacím frameworkem Mockito.

Jistě se již každý z vás někdy ocitl v situaci, kdy je postaven před úkol otestovat metodu, která například při svém běhu načítá data z databáze nebo z internetu. Problém s testováním takového kódu je ten, že pro správný průběh testu musíte mít v databázi připravena testovací data a přístup k těmto datům je obecně řádově pomalejší, než bychom potřebovali.

Uvažujme například následující blok kódu v jazyku Java:

public boolean validateUniqueEmail(String email,EntityManager em){
     TypedQuery<String> q = em.createQuery("SELECT u.email FROM User u", User.class);
     List<String> result = q.getResultList();
     return !result.contains(email);
}

Asi není třeba vysvětlovat, co tato metoda má dělat, avšak pokud byste chtěli testovat správné chování této metody, pak buď musíte připravit v databázi testovací data (pak ale stejně vyvstává otázka, kde vzít instanci EntityManagera), nebo vytvořit vlastní mock pomocí dědění od třídy EntityManager a ten poté vložit jako parametr metody.

Právě s tím Vám pomůže Mockito. V následujícím bloku kódu se nachází testovací metoda, která využívá právě mock EntityManagera, vytvořený Mockitem.

 

public void testValidateEniqueEmail(){
    List<String> testData = new ArrayList<>();
    testData.add("email@somewhere.org");
    testData.add("email@somewhereelse.com");

    // Vytvoreni mock objektu
    EntityManager mockEM = mock(EntityManager.class);
    TypedQuery mockQuery = mock(TypedQuery.class);

    // Definovani chovani mock objektu
    when(mockQuery.getResultList()).thenReturn(testData);
    when(mockEM.createQuery(anyString(),String.class)).thenReturn(mockQuery);

    Assert.assertTrue(validateUniqueEmail("email@unknown.edu",mockEM));
    Assert.assertFalse(validateUniqueEmail("email@somewhere.org",mockEM));
}

Jak je patrné z ukázky, vytváření mock objektů je s Mockitem velice snadné. V tomto příkladu jsme definovali testovací data a poté jsme určili chování mock objektů tak, aby při dotazu tato data byla vrácena jako výsledek. Za zmínku zde stojí použití anyString(), což je v terminologii Mockita takzvaný matcher a zastupuje jakoukoli instanci třídy String (samozřejmě lze definovat i vlastní matchery).

Závěr

V tomto článku jsme si ukázali naprosto základní použití frameworku Mockito. Toto je však pouze zlomek toho, co tento nástroj umí a pokud vás tento článek zaujal a chcete se dozvědět více, pak navštivte stránky http://mockito.org/  nebo mě neváhejte kontaktovat na emailové adrese info@bcvsolutions.eu.

Automatické přidělování rolí

Role v CzechIdM představují balík oprávnění identity ke koncovému systému nebo přímo CzechIdM (admin role). Role lze přiřazovat ručně, například pomocí webového GUI, nebo pomocí workflow a pravidel. Mým úkolem bylo implementovat nový způsob přiřazování rolí – automatické přidělování rolí, které lze použít v průběhu standardní rekoncilace/synchronizace. Dále se v článku dozvíte, jak byla tato nová funkcionalita v CzechIdM implementována a jak automatické přidělování rolí konfigurovat a spouštět.

Automatické role

Nejprve je třeba definovat, co jsou to automatické role. Nově v CzechIdM mají všechny role, včetně admin rolí, atributy, které slouží primárně pro rozhodování, komu danou roli při automatickém přiřazení přidělit. Počet těchto atributů je napevno stanoven na 10 a jsou jednoduše pojmenovány attribute1 až attribute10. Role je automatická právě tehdy, když má vyplněný alespoň jeden tento atribut – hodnota atributu není null a nebo prázdný řetězec.

Pro přiřazování automatických rolí byly definovány 4 nové užitečné metody nad třídou Data.

  • GetAutoRoles() – metoda používá aktivní UserView a pro daného uživatele vrací seznam automatických rolí, které splňují podmínky přidělení v příslušných atributech rolí.
  • AssignAutoRolesExpUsers() – na základě explicitně předaného seznamu uživatelů těmto přiřadí odpovídající automatické role.
  • AssignAutoRolesExpRoles() – na základě explicitně předaného seznamu rolí vyhledá odpovídající uživatele a těmto přiřadí odpovídající automatické role.
  • AssignAutoRoles() – pro všechny uživatele v systému přiřadí odpovídající automatické role.

Pomocí těchto metod lze například ve workflow nebo pravidlech jednorázově přiřadit automatické role uživatelům.

Konfigurace automatického přiřazení rolí

Předtím, než je možné přikročit k samotnému procesu automatického přidělování, je potřeba provést konfiguraci podmínek, které musí uživatelé splňovat, aby jim byla automatická role přidělena.

Podmínky je možné si představit jako trojici:

Atribut:Relace:Hodnota atributu

  • Atribut je název uživatelského atributu, například „tel“
  • Relace je vztah mezi názvem a hodnotou atributu, v současnosti lze vybírat z equal (EQ), not equal (NEQ) a like (LIKE)
  • Hodnota atributu je vypovídající, například „+420 540 123 456“

Konfigurace podmínky probíhá ve dvou krocích. První část konfigurace je umístěna v pravidle getAutoRolesAttributes. Pravidlo tedy editujeme, nejjednodušeji pomocí webového rozhraní. Pravidlo getAutoRolesAttributes obsahuje definici DTO, které představuje první část podmínky pro automatické přidělování rolí. Pravidlo má následující strukturu:

DTO roleAttrs = new DTOGroup();
 DTO attr1 = new DTOGroup();
 attr1.put(Constants.AUTO_ROLE_ATTRIBUTE_NAME, "tel");
 attr1.put(Constants.AUTO_ROLE_ATTRIBUTE_RELATION, RoleAttrRelation.EQ);
 …
 DTO attr10 = new DTOGroup();
 attr10.put(Constants.AUTO_ROLE_ATTRIBUTE_NAME, "");
 attr10.put(Constants.AUTO_ROLE_ATTRIBUTE_RELATION, RoleAttrRelation.EQ);
 …
 roleAttrs.put(AutoRoleAttr.EQ.name(), RoleAttrEq.OR);

Na řádku attr1.put(Constants.AUTO_ROLE_ATTRIBUTE_NAME, "tel"); jako druhý argument funkce attr1.put() vyplníme název atributu uživatele, například „tel“. Na následujícím řádku se vyplňuje Relace, v příkladu je RoleAttrRelation.EQ, který reprezentuje rovnost řetězců. Jak je vidět, lze nastavit až 10 podmínek pro přidělování rolí, přičemž logický operátor mezi jednotlivými podmínkami je ve výchozím stavu OR, jak je vidět na posledním řádku z příkladu.

Nyní máme tedy nastavenou první část podmínky Atribut:Relace:Hodnota a chybí nám ještě poslední část samotná hodnota atributu. Tu nastavujeme do již představených atributů rolí Attribute1 až Attribute10, přičemž pořadí atributů odpovídá řádkům v pravidle getAutoRolesAttributes. Toto můžeme nastavit pomocí webového GUI:

auto_config

Nyní máme již nastavené podmínky pro automatické přidělování rolí. Spuštění automatického přidělování rolí může probíhat automaticky při standardní rekoncilaci/synchronizaci. Pomocí GUI lze nastavit, kdy bude tato funkcionalita aktivní.

synch_conf

Omezení

Je třeba zdůraznit, že automatické přidělení rolí proběhne pouze při změnách uživatelské identity (update, vytvoření). Tedy vždy pouze pro určité stavy a akce. Jsou to tyto:

  • Assigned – UPDATE_IDENTITY
  • Matched – LINK_ACCOUNT_AND_UPDATE
  • Missing identity – CREATE_IDENTITY
  • Missing identity – CREATE_IDENTITY_AND_UPDATE

Automatické role mají určitá omezení, která je třeba mít na paměti při konfigurování. Zejména lze přiřazovat role pouze na základě atributů datového typu String. Například nelze použít pouze název atributu „homeOrganisation“ nebo „disabled“.

Dále je třeba počítat s tím, že jednotlivé podmínky jsou vzájemně spojeny logickým operátorem OR. Návrh automatických rolí počítá s pozdějším přidáním dalších logických operátorů jako je AND, nicméně v současné podobně je jedinou volbou OR.

Závěr

V tomto článku jsem představil novou vlastnost CzechIdM – automatické přiřazování rolí. Byly definovány automatické role, ukázány možnosti konfigurace automatického přiřazení rolí a také omezení pro tuto novou funkcionalitu. Možnosti využití jsou jistě širší, než je schopen pojmout tento článek, proto se můžete těšit na pokračování, kde budou představeny širší možnosti konfigurace automatických rolí. Pro jakékoli dotazy mě můžete kontaktovat na info@bcvsolutions.eu.