Filtry

V aplikaci vznikl mechanismus pro dynamické registrování a skládání filtrů pro vyhladání dat v IdM (identity, role, prvky stromových struktur atd.). V libovolném modulu je možné zaregistrovat nový filtr pro stávající restové služby.

Filtr (FilterBuilder) se registuje s daným klíčem (FilterKey):

  • entityClass - doménový typ, pro který je určen
  • name - název položky, při které se filtr aktivně vyhodnocuje, pokud je uvedena ve filtrovacích kritériích (⇒ get parametr).

O vyhodnocování filtrů se stará FilterManager, který při konstrukci vyhledávání nad doménovým typem:

  • sezbírá všechny zaregistrované aktivní filtry dle klíče:
    • vyhovujícímu danému doménovému typu
    • vyhovujícímu názvu položky přítomné v parametrech, podle kterých se filtruje
  • a nad všemi nalezenými fitry zavolá metodu getPredicate jejichž výsledky (pokud je výsledek) spojí do jedněch vyhledávacích kritérií přes oprerátor and.

Filter musí implementovat metody:

  • getName - vrací název položky viz. výše
  • getPredicate - konstrukce samotných vyhledávacích kritérií
  • find - vrací data (objekty dle doménového typu výše) čiste podle predikátu zkonstruovaného výše

Pro konstrukci nového filtru se dají použít předpřipravené abstraktní třídy:

  • BaseFilterBuilder - dodává základní implementaci pro práci s konfiguraci (viz dále)
  • AbstractFilterBuilder - dodává základní implementaci find metody založené na repozitáři předaném v konstruktoru

Ukázkový filtr slouží pro hledání identity dle username.

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Description;
import org.springframework.stereotype.Component;
 
import eu.bcvsolutions.idm.core.api.dto.filter.IdentityFilter;
import eu.bcvsolutions.idm.core.api.repository.filter.AbstractFilterBuilder;
import eu.bcvsolutions.idm.core.model.entity.IdmIdentity;
import eu.bcvsolutions.idm.core.model.entity.IdmIdentity_;
import eu.bcvsolutions.idm.core.model.repository.IdmIdentityRepository;
 
@Component
@Description("Filter by identity's username")
public class UsernameIdentityFilter extends AbstractFilterBuilder<IdmIdentity, IdentityFilter> {
 
	@Autowired
	public UsernameIdentityFilter(IdmIdentityRepository repository) {
		super(repository);
	}
 
	@Override
	public String getName() {
		return IdentityFilter.PARAMETER_USERNAME;
	}
 
	@Override
	public Predicate getPredicate(Root<IdmIdentity> root, CriteriaQuery<?> query, CriteriaBuilder builder, IdentityFilter filter) {
		if (filter.getUsername() == null) {
			return null;
		}
		return builder.equal(root.get(IdmIdentity_.username), filter.getUsername());
	}
}

Fitry jsou konfigurovatelné díky rozhraní Configurable skrze standardní konfiguraci aplikace.

Může existovat více filtrů se stejným klíčem ⇒ přes konfigurační položku impl vyberu tu, která se bude používat. Tím může libovolný modul nejen zaregistrovat, ale i změnit chování stávajících filtrů, které jsou implementovány přes rozhraní FilterBuilder.

UuidFilter

Obecný filtr pro nalezení libovolné entity (potomka AbstractEntity) dle jejího uuid (parameter ve filtru - id).

UsernameIdentityFilter

Nalezení identity dle uživatelského jména (parameter ve filtru - username).

DefaultManagersFilter

Nalezení nadřízených pro zadanou identitu dle PPV, stromových struktur a nastavených garantů. Nadřízeným (manager) je ta identita, která má PPV na nadřazenému prvku organizační struktury oproti prvku struktury u PPV podřízeného. Nadřízeného (garant) lze nakonfigurovat i napřímo na PPV

Parametry ve filtru

  • managersFor - klíčový parametr, uuid podřízeného, pro kterou jsou hledáni nadřízení
  • managersByTreeType - aditivní paramer, pokud je zadán, jsou nadřízení hledáni pouze dle PPV s daným typem struktury
  • managersByContract - aditivní paramer, pokud je zadán, jsou nadřízení hledáni pouze dle daného PPV
  • includeGuarantees - defaultně true ⇒ jsou hledání nadřízení (manager) dle stromových struktur i nadřízení (garant) nakonfigurovaní napřímo na PPV. False ⇒ pouze nadřízení (manager) dle stromových struktur.

Konfigurace:

## identity filters
## managers by standard tree structure (manager will be found by contract on parent node)
idm.sec.core.filter.IdmIdentity.managersFor.impl=defaultManagersFilter

DefaultSubordinatesFilter

Nalezení podřízených pro zadanou identitu dle PPV, stromových struktur a nastavených garantů. Podřízeným je ta identita, která má PPV na podřazeném prvku organizační struktury oproti prvku struktury u PPV nadřízeného. Garant lze nakonfigurovat i napřímo na PPV.

Parametry ve filtru

  • sobordinatesFor - klíčový parametr, uuid nadřízeného, pro kterou jsou hledáni podřízení
  • subordinatesByTreeType - aditivní paramer, pokud je zadán, jsou podřízení hledáni pouze dle PPV s daným typem struktury

Konfigurace:

## identity filters
## subordinates by standard tree structure (manager will be found by contract on parent node)
idm.sec.core.filter.IdmIdentity.subordinatesFor.impl=defaultSubordinatesFilter

EavCodeManagersFilter

Druhá varianta pro nalezení nadřízených stejně jako DefaultSubordinatesFilter s rozdílem, že nadřazený prvek není hledán dle stromové struktury, ale podle hodnoty rozšířeného (eav) parametru prvku stromu - u prvku stromu je uveden kód jiného prvku, ve kterém jsou definování nadřízení (mají PPV na daný prvek). Jinak jsou funkce i parametry stejné.

## identity filters
## managers by relation in eav attribute (manager will be found by code in eav on parent node)
idm.sec.core.filter.IdmIdentity.managersFor.impl=eavCodeManagersFilter
# extended form definition code
idm.sec.core.filter.IdmIdentity.managersFor.formDefinition=default
# extended attribute code - value contains superior node code
idm.sec.core.filter.IdmIdentity.managersFor.formAttribute=parentCode

EavCodeSubordinatesFilter

Druhá varianta pro nalezení podřízených stejně jako DefaultManagersFilter s rozdílem, že nadřazený prvek není hledán dle stromové struktury, ale podle hodnoty rozšířeného (eav) parametru prvku stromu - u prvku stromu je uveden kód jiného prvku, ve kterém jsou definování nadřízení (mají PPV na daný prvek). Jinak jsou funkce i parametry stejné.

## identity filters
## subordinates by relation in eav attribute (subordinates will be found by code in eav on parent node)
idm.sec.core.filter.IdmIdentity.subordinatesFor.impl=eavCodeSubordinatesFilter
# extended form definition code
idm.sec.core.filter.IdmIdentity.subordinatesFor.formDefinition=default
# extended attribute code - value contains superior node code
idm.sec.core.filter.IdmIdentity.subordinatesFor.formAttribute=parentCode