All Downloads are FREE. Search and download functionalities are using the official Maven repository.

no.nav.apiapp.security.veilarbabac.TilgangssjekkBruker Maven / Gradle / Ivy

package no.nav.apiapp.security.veilarbabac;

import no.nav.apiapp.feil.IngenTilgang;
import org.slf4j.Logger;

import java.util.Optional;
import java.util.function.Supplier;

import static no.nav.apiapp.security.veilarbabac.MetrikkLogger.Tilgangstype.PersonAktoerId;
import static no.nav.apiapp.security.veilarbabac.MetrikkLogger.Tilgangstype.PersonFoedselsnummer;
import static org.slf4j.LoggerFactory.getLogger;

class TilgangssjekkBruker {

    private static final Logger logger = getLogger(TilgangssjekkBruker.class);

    private MetrikkLogger metrikk = new MetrikkLogger(logger,"read",()->"");
    private Supplier veilarbabacFnrSjekker;
    private Supplier veilarbabacAktoerIdSjekker;
    private Runnable abacFnrSjekker = ()->{};

    private Boolean brukAktoerId = false;
    private Boolean sammenliknTilgang = false;
    private Boolean foretrekkVeilarbAbac = false;

    TilgangssjekkBruker() {
    }

    TilgangssjekkBruker metrikkLogger(Logger logger, String action, Supplier idSupplier) {
        this.metrikk = new MetrikkLogger(logger,action,idSupplier);
        return this;
    }

    TilgangssjekkBruker veilarbAbacFnrSjekker(Supplier veilarbabacFnrSjekker) {
        this.veilarbabacFnrSjekker = veilarbabacFnrSjekker;
        return this;
    }

    TilgangssjekkBruker veilarbAbacAktoerIdSjekker(Supplier veilarbabacAktoerIdSjekker) {
        this.veilarbabacAktoerIdSjekker = veilarbabacAktoerIdSjekker;
        return this;
    }

    TilgangssjekkBruker abacFnrSjekker(Runnable abacFnrSjekker) {
        this.abacFnrSjekker = abacFnrSjekker;
        return this;
    }

    TilgangssjekkBruker foretrekkVeilarbAbac(boolean foretrekkVeilarbAbac) {
        this.foretrekkVeilarbAbac = foretrekkVeilarbAbac;
        return this;
    }

    TilgangssjekkBruker sammenliknTilgang(boolean sammenlikntilgang) {
        this.sammenliknTilgang = sammenlikntilgang;
        return this;
    }

    TilgangssjekkBruker brukAktoerId(boolean brukAktoerId) {
        this.brukAktoerId = brukAktoerId;
        return this;
    }

    void sjekkTilgangTilBruker() {


        boolean harTilgang;

        if (brukAktoerId && sammenliknTilgang) {
            harTilgang = sjekkOgSammenliknTilgangForAktoerIdOgFnr();
        } else if (sammenliknTilgang) {
            harTilgang = sjekkOgSammenliknTilgangForFnr();
        } else if (brukAktoerId) {
            harTilgang = tryggVeilarbabacAktorIdSjekker().orElse(false);
        } else {
            harTilgang = tryggAbacFnrSjekker().orElse(false);
        }

        metrikk.loggMetrikk(brukAktoerId ? PersonAktoerId : PersonFoedselsnummer,foretrekkVeilarbAbac);

        if (!harTilgang) {
            throw new IngenTilgang();
        }
    }

    private boolean sjekkOgSammenliknTilgangForFnr() {
        Optional veilarbAbacResultat = tryggVeilarbabacFnrSjekker();
        Optional abacResultat = tryggAbacFnrSjekker();

        if (veilarbAbacResultat.isPresent() && abacResultat.isPresent() && !abacResultat.equals(veilarbAbacResultat)) {
            metrikk.erAvvik();
        }

        return foretrekkVeilarbAbac
                ? veilarbAbacResultat.orElse(abacResultat.orElse(false))
                : abacResultat.orElse(veilarbAbacResultat.orElse(false));

      }

    private boolean sjekkOgSammenliknTilgangForAktoerIdOgFnr() {
        Optional aktoerIdResultat = tryggVeilarbabacAktorIdSjekker();
        Optional fnrResultat = tryggVeilarbabacFnrSjekker();

        if (fnrResultat.isPresent() && aktoerIdResultat.isPresent() && !fnrResultat.equals(aktoerIdResultat)) {
            metrikk.erAvvik();;
        }

        // Stoler mest på fnr-resultatet hvis begge finnes, men prøver å gi et resultat
        return fnrResultat.orElse(aktoerIdResultat.orElse(false));
    }

    private Optional tryggVeilarbabacFnrSjekker() {
        Optional fnrResultat=Optional.empty();

        try {
            fnrResultat = Optional.of(veilarbabacFnrSjekker.get());
        } catch(Throwable e) {
            logger.error("Kall mot veilarbAbac (fnr) feiler", e);
        }
        return fnrResultat;
    }

    private Optional tryggVeilarbabacAktorIdSjekker() {
        Optional aktoerIdResultat=Optional.empty();

        try {
            aktoerIdResultat = Optional.of(veilarbabacAktoerIdSjekker.get());
        } catch(Throwable e) {
            // Ignorer feilen. Vi kjører videre med fnr
            logger.error("Kall mot veilarbAbac (aktørId) feiler", e);
        }
        return aktoerIdResultat;
    }

    private Optional tryggAbacFnrSjekker() {
        try {
            abacFnrSjekker.run();
            return Optional.of(true);
        } catch (IngenTilgang e) {
            return Optional.of(false);
        }
        catch(Throwable e) {
            logger.error("Kall mot abac feiler", e);
        }
        return Optional.empty();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy