From 0932ad0f7bce071f4e9bd6e273987d1ab7742015 Mon Sep 17 00:00:00 2001 From: Jens-Otto Larsen <46576810+jolarsen@users.noreply.github.com> Date: Sun, 9 Feb 2025 17:24:56 +0100 Subject: [PATCH] TFP-5952 flytt auditlogging til PEP (#1414) * TFP-5952 flytt auditlogging til PEP * Flytte attributtnavn til logger --- .../sikkerhet/abac/AbacAuditlogger.java | 79 +++++--- .../vedtak/sikkerhet/abac/AbacResultat.java | 4 + .../abac/BeskyttetRessursInterceptor.java | 66 ++----- .../no/nav/vedtak/sikkerhet/abac/Pep.java | 2 +- .../no/nav/vedtak/sikkerhet/abac/PepImpl.java | 18 +- .../sikkerhet/abac/Tilgangsbeslutning.java | 4 - .../internal/BeskyttetRessursAttributter.java | 12 +- .../sikkerhet/abac/AbacAuditLoggerTest.java | 183 +++++++++++++++++ .../vedtak/sikkerhet/abac/PepImplTest.java | 18 +- .../BeskyttetRessursInterceptorTest.java | 186 +++++++----------- 10 files changed, 356 insertions(+), 216 deletions(-) create mode 100644 felles/abac/src/test/java/no/nav/vedtak/sikkerhet/abac/AbacAuditLoggerTest.java diff --git a/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/AbacAuditlogger.java b/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/AbacAuditlogger.java index 4d9271ba7..b83e571d9 100644 --- a/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/AbacAuditlogger.java +++ b/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/AbacAuditlogger.java @@ -27,13 +27,19 @@ import jakarta.enterprise.context.Dependent; import jakarta.inject.Inject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import no.nav.vedtak.log.audit.Auditdata; import no.nav.vedtak.log.audit.AuditdataHeader; import no.nav.vedtak.log.audit.Auditlogger; import no.nav.vedtak.log.audit.CefField; import no.nav.vedtak.log.audit.EventClassId; +import no.nav.vedtak.sikkerhet.abac.beskyttet.ActionType; +import no.nav.vedtak.sikkerhet.abac.beskyttet.ResourceType; import no.nav.vedtak.sikkerhet.abac.internal.BeskyttetRessursAttributter; import no.nav.vedtak.sikkerhet.abac.pdp.AppRessursData; +import no.nav.vedtak.sikkerhet.kontekst.IdentType; /** * Dette loggformatet er avklart med Arcsight. Eventuelle nye felter skal @@ -43,6 +49,8 @@ @Dependent public class AbacAuditlogger { + private static final Logger LOG = LoggerFactory.getLogger(AbacAuditlogger.class); + private final Auditlogger auditlogger; @Inject @@ -50,27 +58,30 @@ public AbacAuditlogger(Auditlogger auditlogger) { this.auditlogger = auditlogger; } - public void loggTilgang(String userId, Tilgangsbeslutning tilgangsbeslutning) { - logg(userId, tilgangsbeslutning, Access.GRANTED); - } - - public void loggDeny(String userId, Tilgangsbeslutning tilgangsbeslutning) { - logg(userId, tilgangsbeslutning, Access.DENIED); - } + public void loggUtfall(AbacResultat utfall, BeskyttetRessursAttributter beskyttetRessursAttributter, AppRessursData appRessursData) { + if (IdentType.Systemressurs.equals(beskyttetRessursAttributter.getIdentType())) { + // Skal ikke auditlogge systemkall + if (!utfall.fikkTilgang()) { + LOG.info("ABAC AVSLAG SYSTEMBRUKER {} tjeneste {}", beskyttetRessursAttributter.getBrukerId(), beskyttetRessursAttributter.getServicePath()); + } + } else if (beskyttetRessursAttributter.isSporingslogg()) { + try { + logg(beskyttetRessursAttributter, appRessursData, utfall.fikkTilgang() ? Access.GRANTED : Access.DENIED); + } catch (Exception e) { + LOG.warn("ABAC AUDITLOG FAILURE ident {} tjeneste {}", beskyttetRessursAttributter.getIdentType(), beskyttetRessursAttributter.getServicePath(), e); + } - private void logg(String userId, Tilgangsbeslutning tilgangsbeslutning, Access access) { - logg(userId, tilgangsbeslutning.beskyttetRessursAttributter(), tilgangsbeslutning.appRessursData(), access); + } } - private void logg(String userId, BeskyttetRessursAttributter beskyttetRessursAttributter, AppRessursData appRessursData, Access access) { + private void logg(BeskyttetRessursAttributter beskyttetRessursAttributter, AppRessursData appRessursData, Access access) { requireNonNull(beskyttetRessursAttributter); requireNonNull(beskyttetRessursAttributter.getDataAttributter()); - String abacAction = requireNonNull(beskyttetRessursAttributter.getActionType().getEksternKode()); - var header = createHeader(abacAction, access); - var fields = createDefaultAbacFields(userId, beskyttetRessursAttributter); + var header = createHeader(beskyttetRessursAttributter.getActionType(), access); + var fields = createDefaultAbacFields(beskyttetRessursAttributter); - List ids = getBerortBrukerId(appRessursData); + List ids = getBerortBrukerId(appRessursData); // TODO: Vurder å kun logge for hovedperson for (String aktorId : ids) { loggTilgangPerBerortAktoer(header, fields, aktorId); } @@ -83,7 +94,7 @@ private void loggTilgangPerBerortAktoer(AuditdataHeader header, Set fi auditlogger.logg(auditdata); } - private AuditdataHeader createHeader(String abacAction, Access access) { + private AuditdataHeader createHeader(ActionType abacAction, Access access) { return new AuditdataHeader.Builder().medVendor(auditlogger.getDefaultVendor()) .medProduct(auditlogger.getDefaultProduct()) .medEventClassId(finnEventClassIdFra(abacAction)) @@ -92,18 +103,18 @@ private AuditdataHeader createHeader(String abacAction, Access access) { .build(); } - private Set createDefaultAbacFields(String userId, BeskyttetRessursAttributter beskyttetRessursAttributter) { - var abacAction = requireNonNull(beskyttetRessursAttributter.getActionType().getEksternKode()); - var abacResourceType = requireNonNull(beskyttetRessursAttributter.getResourceType()); + protected Set createDefaultAbacFields(BeskyttetRessursAttributter beskyttetRessursAttributter) { + var abacAction = requireNonNull(mapActionType(beskyttetRessursAttributter.getActionType())); + var abacResourceType = requireNonNull(mapResourceType(beskyttetRessursAttributter.getResourceType())); Set fields = new HashSet<>(); fields.add(new CefField(EVENT_TIME, System.currentTimeMillis())); fields.add(new CefField(REQUEST, beskyttetRessursAttributter.getServicePath())); - fields.add(new CefField(ABAC_RESOURCE_TYPE, abacResourceType.getResourceTypeAttribute())); + fields.add(new CefField(ABAC_RESOURCE_TYPE, abacResourceType)); fields.add(new CefField(ABAC_ACTION, abacAction)); - if (userId != null) { - fields.add(new CefField(USER_ID, userId)); + if (beskyttetRessursAttributter.getBrukerId() != null) { + fields.add(new CefField(USER_ID, beskyttetRessursAttributter.getBrukerId())); } getOneOfNew(beskyttetRessursAttributter.getDataAttributter(), SAKSNUMMER, FAGSAK_ID).ifPresent(fagsak -> fields.addAll(forSaksnummer(fagsak))); @@ -136,15 +147,33 @@ private static Optional getOneOfNew(AbacDataAttributter attributter, Aba return Optional.empty(); } - private static EventClassId finnEventClassIdFra(String abacAction) { + private static EventClassId finnEventClassIdFra(ActionType abacAction) { return switch (abacAction) { - case "read" -> AUDIT_ACCESS; /* Fall-through */ - case "delete", "update" -> AUDIT_UPDATE; - case "create" -> AUDIT_CREATE; + case READ -> AUDIT_ACCESS; /* Fall-through */ + case DELETE, UPDATE -> AUDIT_UPDATE; + case CREATE -> AUDIT_CREATE; default -> throw new IllegalArgumentException("Ukjent abacAction: " + abacAction); }; } + private static String mapActionType(ActionType actionType) { + return actionType == ActionType.DUMMY ? null : actionType.name().toLowerCase(); + } + + // TODO: vurder å forkorte vekk abac.attributter. + private static String mapResourceType(ResourceType resourceType) { + return switch (resourceType) { + case APPLIKASJON -> "no.nav.abac.attributter.foreldrepenger"; + case DRIFT -> "no.nav.abac.attributter.foreldrepenger.drift"; + case FAGSAK -> "no.nav.abac.attributter.foreldrepenger.fagsak"; + case VENTEFRIST -> "no.nav.abac.attributter.foreldrepenger.fagsak.ventefrist"; + case OPPGAVESTYRING_AVDELINGENHET -> "no.nav.abac.attributter.foreldrepenger.oppgavestyring.avdelingsenhet"; + case OPPGAVESTYRING -> "no.nav.abac.attributter.foreldrepenger.oppgavestyring"; + case UTTAKSPLAN -> "no.nav.abac.attributter.foreldrepenger.uttaksplan"; + case PIP, DUMMY -> throw new IllegalArgumentException("Ulovlig resourceType: " + resourceType); + }; + } + /** * Standard hos NAV er at tilgang logges som "INFO" og avslag som "WARN". Merk * at dette avviker fra CEF-standarden. diff --git a/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/AbacResultat.java b/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/AbacResultat.java index 135bf7aea..5b244b436 100644 --- a/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/AbacResultat.java +++ b/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/AbacResultat.java @@ -6,4 +6,8 @@ public enum AbacResultat { AVSLÅTT_KODE_6, AVSLÅTT_EGEN_ANSATT, AVSLÅTT_ANNEN_ÅRSAK; + + public boolean fikkTilgang() { + return this == GODKJENT; + } } diff --git a/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/BeskyttetRessursInterceptor.java b/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/BeskyttetRessursInterceptor.java index b5741c632..f16785cfb 100644 --- a/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/BeskyttetRessursInterceptor.java +++ b/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/BeskyttetRessursInterceptor.java @@ -3,7 +3,6 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Collection; -import java.util.Optional; import jakarta.annotation.Priority; import jakarta.enterprise.context.Dependent; @@ -13,16 +12,12 @@ import jakarta.interceptor.InvocationContext; import org.jboss.weld.interceptor.util.proxy.TargetInstanceProxy; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import no.nav.foreldrepenger.konfig.Environment; import no.nav.vedtak.exception.TekniskException; import no.nav.vedtak.sikkerhet.abac.beskyttet.ActionType; import no.nav.vedtak.sikkerhet.abac.beskyttet.ResourceType; import no.nav.vedtak.sikkerhet.abac.internal.ActionUthenter; import no.nav.vedtak.sikkerhet.abac.internal.BeskyttetRessursAttributter; -import no.nav.vedtak.sikkerhet.kontekst.IdentType; @BeskyttetRessurs(actionType = ActionType.DUMMY, resourceType = ResourceType.DUMMY) @Interceptor @@ -30,50 +25,31 @@ @Dependent public class BeskyttetRessursInterceptor { - private static final Environment ENV = Environment.current(); - private static final Logger LOG = LoggerFactory.getLogger(BeskyttetRessursInterceptor.class); - private final Pep pep; - private final AbacAuditlogger abacAuditlogger; private final TokenProvider tokenProvider; @Inject - public BeskyttetRessursInterceptor(Pep pep, AbacAuditlogger abacAuditlogger, TokenProvider provider) { + public BeskyttetRessursInterceptor(Pep pep, TokenProvider provider) { this.pep = pep; - this.abacAuditlogger = abacAuditlogger; this.tokenProvider = provider; } @AroundInvoke public Object wrapTransaction(final InvocationContext invocationContext) throws Exception { - var dataAttributter = finnAbacDataAttributter(invocationContext); - var beskyttetRessursAttributter = hentBeskyttetRessursAttributter(invocationContext, dataAttributter); + var method = invocationContext.getMethod(); + var dataAttributter = finnAbacDataAttributter(method, invocationContext.getParameters()); + var beskyttetRessursAttributter = hentBeskyttetRessursAttributter(method, getOpprinneligKlasse(invocationContext), dataAttributter); + var beslutning = pep.vurderTilgang(beskyttetRessursAttributter); if (beslutning.fikkTilgang()) { - return proceed(invocationContext, beslutning); - } - return ikkeTilgang(beslutning); - } - - private Object proceed(InvocationContext invocationContext, Tilgangsbeslutning beslutning) throws Exception { - Method method = invocationContext.getMethod(); - boolean sporingslogges = method.getAnnotation(BeskyttetRessurs.class).sporingslogg(); - if (!erSystembrukerKall(beslutning.beskyttetRessursAttributter()) && sporingslogges) { - Object resultat = invocationContext.proceed(); - abacAuditlogger.loggTilgang(tokenProvider.getUid(), beslutning); - return resultat; - } - return invocationContext.proceed(); - } - - private Object ikkeTilgang(Tilgangsbeslutning beslutning) { - if (!erSystembrukerKall(beslutning.beskyttetRessursAttributter())) { - abacAuditlogger.loggDeny(tokenProvider.getUid(), beslutning); + return invocationContext.proceed(); } else { - LOG.info("ABAC AVSLAG SYSTEMBRUKER {}", beslutning.beskyttetRessursAttributter().getBrukerId()); + return ikkeTilgang(beslutning); } + } - switch (beslutning.beslutningKode()) { + private Object ikkeTilgang(AbacResultat abacResultat) { + switch (abacResultat) { case AVSLÅTT_KODE_6 -> throw new PepNektetTilgangException("F-709170", "Tilgangskontroll.Avslag.Kode6"); case AVSLÅTT_KODE_7 -> throw new PepNektetTilgangException("F-027901", "Tilgangskontroll.Avslag.Kode7"); case AVSLÅTT_EGEN_ANSATT -> throw new PepNektetTilgangException("F-788257", "Tilgangskontroll.Avslag.EgenAnsatt"); @@ -81,16 +57,7 @@ private Object ikkeTilgang(Tilgangsbeslutning beslutning) { } } - private boolean erSystembrukerKall(BeskyttetRessursAttributter beskyttetRessursAttributter) { - return Optional.ofNullable(beskyttetRessursAttributter) - .map(BeskyttetRessursAttributter::getIdentType) - .filter(IdentType::erSystem) - .isPresent(); - } - - private BeskyttetRessursAttributter hentBeskyttetRessursAttributter(InvocationContext invocationContext, AbacDataAttributter dataAttributter) { - Class clazz = getOpprinneligKlasse(invocationContext); - var method = invocationContext.getMethod(); + private BeskyttetRessursAttributter hentBeskyttetRessursAttributter(Method method, Class mClass, AbacDataAttributter dataAttributter) { var beskyttetRessurs = method.getAnnotation(BeskyttetRessurs.class); var token = Token.withOidcToken(tokenProvider.openIdToken()); @@ -104,19 +71,20 @@ private BeskyttetRessursAttributter hentBeskyttetRessursAttributter(InvocationCo .medActionType(beskyttetRessurs.actionType()) .medAvailabilityType(beskyttetRessurs.availabilityType()) .medResourceType(finnResource(beskyttetRessurs)) + .medSporingslogg(beskyttetRessurs.sporingslogg()) .medPepId(pep.pepId()) - .medServicePath(utledAction(clazz, method)) + .medServicePath(utledAction(mClass, method)) .medDataAttributter(dataAttributter) .build(); } - static AbacDataAttributter finnAbacDataAttributter(InvocationContext invocationContext) { - var method = invocationContext.getMethod(); + static AbacDataAttributter finnAbacDataAttributter(Method method, Object[] parameters) { var dataAttributter = AbacDataAttributter.opprett(); var parameterDecl = method.getParameters(); - for (int i = 0; i < method.getParameterCount(); i++) { - Object parameterValue = invocationContext.getParameters()[i]; + var parameterCount = method.getParameterCount(); + for (int i = 0; i < parameterCount; i++) { + Object parameterValue = parameters[i]; var tilpassetAnnotering = parameterDecl[i].getAnnotation(TilpassetAbacAttributt.class); leggTilAttributterFraParameter(dataAttributter, parameterValue, tilpassetAnnotering); } diff --git a/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/Pep.java b/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/Pep.java index e035d48e5..d28b46830 100644 --- a/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/Pep.java +++ b/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/Pep.java @@ -5,7 +5,7 @@ public interface Pep { - Tilgangsbeslutning vurderTilgang(BeskyttetRessursAttributter beskyttetRessursAttributter); + AbacResultat vurderTilgang(BeskyttetRessursAttributter beskyttetRessursAttributter); default String pepId() { return Environment.current().getNaisAppName(); diff --git a/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/PepImpl.java b/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/PepImpl.java index 3b1578d0d..d32c72b1f 100644 --- a/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/PepImpl.java +++ b/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/PepImpl.java @@ -8,9 +8,6 @@ import jakarta.enterprise.inject.Default; import jakarta.inject.Inject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import no.nav.vedtak.sikkerhet.abac.beskyttet.ActionType; import no.nav.vedtak.sikkerhet.abac.internal.BeskyttetRessursAttributter; import no.nav.vedtak.sikkerhet.abac.pdp.AppRessursData; @@ -30,8 +27,7 @@ @ApplicationScoped public class PepImpl implements Pep { - private static final Logger LOG = LoggerFactory.getLogger(PepImpl.class); - + private AbacAuditlogger abacAuditlogger; private PopulasjonKlient populasjonKlient; private AnsattGruppeKlient ansattGruppeKlient; private PdpRequestBuilder pdpRequestBuilder; @@ -42,21 +38,25 @@ public class PepImpl implements Pep { } @Inject - public PepImpl(PopulasjonKlient populasjonKlient, AnsattGruppeKlient ansattGruppeKlient, PdpRequestBuilder pdpRequestBuilder) { + public PepImpl(AbacAuditlogger abacAuditlogger, + PopulasjonKlient populasjonKlient, + AnsattGruppeKlient ansattGruppeKlient, + PdpRequestBuilder pdpRequestBuilder) { + this.abacAuditlogger = abacAuditlogger; this.populasjonKlient = populasjonKlient; this.ansattGruppeKlient = ansattGruppeKlient; this.pdpRequestBuilder = pdpRequestBuilder; } @Override - public Tilgangsbeslutning vurderTilgang(BeskyttetRessursAttributter beskyttetRessursAttributter) { + public AbacResultat vurderTilgang(BeskyttetRessursAttributter beskyttetRessursAttributter) { var appRessurser = pdpRequestBuilder.lagAppRessursData(beskyttetRessursAttributter.getDataAttributter()); var vurdering = forespørTilgang(beskyttetRessursAttributter, appRessurser); - return new Tilgangsbeslutning(vurdering.tilgangResultat(), beskyttetRessursAttributter, appRessurser); + abacAuditlogger.loggUtfall(vurdering.tilgangResultat(), beskyttetRessursAttributter, appRessurser); + return vurdering.tilgangResultat(); } - // Skal kunne kalles fra evt subklasser av PepImpl protected Tilgangsvurdering forespørTilgang(BeskyttetRessursAttributter beskyttetRessursAttributter, AppRessursData appRessursData) { if (ActionType.DUMMY.equals(beskyttetRessursAttributter.getActionType())) { diff --git a/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/Tilgangsbeslutning.java b/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/Tilgangsbeslutning.java index 761bf2337..096809567 100644 --- a/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/Tilgangsbeslutning.java +++ b/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/Tilgangsbeslutning.java @@ -6,8 +6,4 @@ public record Tilgangsbeslutning(AbacResultat beslutningKode, BeskyttetRessursAttributter beskyttetRessursAttributter, AppRessursData appRessursData) { - - public boolean fikkTilgang() { - return beslutningKode == AbacResultat.GODKJENT; - } } diff --git a/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/internal/BeskyttetRessursAttributter.java b/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/internal/BeskyttetRessursAttributter.java index cf015242e..b05f2aab2 100644 --- a/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/internal/BeskyttetRessursAttributter.java +++ b/felles/abac/src/main/java/no/nav/vedtak/sikkerhet/abac/internal/BeskyttetRessursAttributter.java @@ -19,13 +19,14 @@ public class BeskyttetRessursAttributter { private String brukerId; private UUID brukerOid; private IdentType identType; - private Set ansattGrupper = new LinkedHashSet<>(); + private final Set ansattGrupper = new LinkedHashSet<>(); private ActionType actionType; private ResourceType resourceType; private AvailabilityType availabilityType; private Token token; private String pepId; private String servicePath; + private boolean sporingslogg = true; private AbacDataAttributter dataAttributter; public static Builder builder() { @@ -60,6 +61,10 @@ public ResourceType getResourceType() { return resourceType; } + public boolean isSporingslogg() { + return sporingslogg; + } + public Token getToken() { return token; } @@ -129,6 +134,11 @@ public Builder medResourceType(ResourceType resourceType) { return this; } + public Builder medSporingslogg(boolean sporingslogg) { + pdpRequest.sporingslogg = sporingslogg; + return this; + } + public Builder medPepId(String pepId) { pdpRequest.pepId = pepId; return this; diff --git a/felles/abac/src/test/java/no/nav/vedtak/sikkerhet/abac/AbacAuditLoggerTest.java b/felles/abac/src/test/java/no/nav/vedtak/sikkerhet/abac/AbacAuditLoggerTest.java new file mode 100644 index 000000000..c14c123da --- /dev/null +++ b/felles/abac/src/test/java/no/nav/vedtak/sikkerhet/abac/AbacAuditLoggerTest.java @@ -0,0 +1,183 @@ +package no.nav.vedtak.sikkerhet.abac; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.lang.reflect.Method; +import java.util.Set; +import java.util.UUID; +import java.util.regex.Pattern; + +import jakarta.ws.rs.Path; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +import no.nav.vedtak.log.audit.Auditdata; +import no.nav.vedtak.log.audit.Auditlogger; +import no.nav.vedtak.sikkerhet.abac.beskyttet.ActionType; +import no.nav.vedtak.sikkerhet.abac.beskyttet.ResourceType; +import no.nav.vedtak.sikkerhet.abac.internal.ActionUthenter; +import no.nav.vedtak.sikkerhet.abac.internal.BeskyttetRessursAttributter; +import no.nav.vedtak.sikkerhet.abac.internal.BeskyttetRessursInterceptorTest; +import no.nav.vedtak.sikkerhet.abac.pdp.AppRessursData; +import no.nav.vedtak.sikkerhet.kontekst.IdentType; + +@ExtendWith(MockitoExtension.class) +class AbacAuditLoggerTest { + + private final AktørDto aktør1 = new AktørDto("00000000000"); + private final BehandlingIdDto behandlingIdDto = new BehandlingIdDto(1234L); + + private final ArgumentCaptor auditdataCaptor = ArgumentCaptor.forClass(Auditdata.class); + + @Test + void auditlogg_skal_logge_parametre_som_går_til_pdp_til_sporingslogg_ved_permit() throws Exception { + final var auditlogger = mockAuditLogger(); + final var abacAuditlogger = new AbacAuditlogger(auditlogger); + + var method = RestClass.class.getMethod("aktoerIn", AktørDto.class); + var appRessursData = AppRessursData.builder().leggTilAktørId(aktør1.aktørId()).build(); + var beskyttetRessursAttributter = getBeskyttetRessursAttributter(method, + BeskyttetRessursInterceptor.finnAbacDataAttributter(method, new Object[]{aktør1})); + + abacAuditlogger.loggUtfall(AbacResultat.GODKJENT, beskyttetRessursAttributter, appRessursData); + assertGotPattern(auditlogger, + "CEF:0|felles|felles-test|1.0|audit:create|ABAC Sporingslogg|INFO|act=create duid=00000000000 end=__NUMBERS__ request=/foo/aktoer_in requestContext=no.nav.abac.attributter.foreldrepenger.fagsak suid=A000000"); + } + + @Test + void auditlogg_skal_også_logge_input_parametre_til_sporingslogg_ved_permit() throws Exception { + final Auditlogger auditlogger = mockAuditLogger(); + final AbacAuditlogger abacAuditlogger = new AbacAuditlogger(auditlogger); + + var method = RestClass.class.getMethod("behandlingIdIn", BehandlingIdDto.class); + var appRessursData = AppRessursData.builder().leggTilAktørId(aktør1.aktørId()).build(); + var beskyttetRessursAttributter = getBeskyttetRessursAttributter(method, + BeskyttetRessursInterceptor.finnAbacDataAttributter(method, new Object[]{behandlingIdDto})); + + abacAuditlogger.loggUtfall(AbacResultat.GODKJENT, beskyttetRessursAttributter, appRessursData); + + assertGotPattern(auditlogger, + "CEF:0|felles|felles-test|1.0|audit:create|ABAC Sporingslogg|INFO|act=create duid=00000000000 end=__NUMBERS__ flexString2=1234 flexString2Label=Behandling request=/foo/behandling_id_in requestContext=no.nav.abac.attributter.foreldrepenger.fagsak suid=A000000"); + } + + @Test + void auditlog_skal_ikke_logge_parametre_som_går_til_pdp_til_sporingslogg_ved_permit_når_det_er_konfigurert_unntak_i_annotering() throws Exception { + final Auditlogger auditlogger = mock(Auditlogger.class); + final AbacAuditlogger abacAuditlogger = new AbacAuditlogger(auditlogger); + + var method = RestClass.class.getMethod("utenSporingslogg", BehandlingIdDto.class); + var appRessursData = AppRessursData.builder().leggTilAktørId(aktør1.aktørId()).build(); + var beskyttetRessursAttributter = getBeskyttetRessursAttributter(method, + BeskyttetRessursInterceptor.finnAbacDataAttributter(method, new Object[]{behandlingIdDto})); + + abacAuditlogger.loggUtfall(AbacResultat.GODKJENT, beskyttetRessursAttributter, appRessursData); + + verify(auditlogger, never()).logg(Mockito.any()); + } + + @Test + void auditlog_skal_logge_parametre_som_går_til_pdp_til_sporingslogg_ved_deny() throws Exception { + final Auditlogger auditlogger = mockAuditLogger(); + final AbacAuditlogger abacAuditlogger = new AbacAuditlogger(auditlogger); + + var method = RestClass.class.getMethod("aktoerIn", AktørDto.class); + var appRessursData = AppRessursData.builder().leggTilAktørId(aktør1.aktørId()).build(); + var beskyttetRessursAttributter = getBeskyttetRessursAttributter(method, + BeskyttetRessursInterceptor.finnAbacDataAttributter(method, new Object[]{aktør1})); + + abacAuditlogger.loggUtfall(AbacResultat.AVSLÅTT_KODE_6, beskyttetRessursAttributter, appRessursData); + + assertGotPattern(auditlogger, + "CEF:0|felles|felles-test|1.0|audit:create|ABAC Sporingslogg|WARN|act=create duid=00000000000 end=__NUMBERS__ request=/foo/aktoer_in requestContext=no.nav.abac.attributter.foreldrepenger.fagsak suid=A000000"); + } + + + private void assertGotPattern(final Auditlogger auditlogger, String expected) { + verify(auditlogger).logg(auditdataCaptor.capture()); + final String actual = auditdataCaptor.getValue().toString(); + assertThat(actual).matches(toAuditdataPattern(expected)); + } + + private static Auditlogger mockAuditLogger() { + final Auditlogger auditlogger = mock(Auditlogger.class); + when(auditlogger.getDefaultVendor()).thenReturn("felles"); + when(auditlogger.getDefaultProduct()).thenReturn("felles-test"); + return auditlogger; + } + + private BeskyttetRessursAttributter getBeskyttetRessursAttributter(Method method, AbacDataAttributter dataAttributter) { + var beskyttetRessurs = method.getAnnotation(BeskyttetRessurs.class); + + return BeskyttetRessursAttributter.builder() + .medBrukerId("A000000") + .medBrukerOid(UUID.randomUUID()) + .medIdentType(IdentType.InternBruker) + .medAnsattGrupper(Set.of()) + .medToken(Token.withOidcToken(BeskyttetRessursInterceptorTest.DUMMY_OPENID_TOKEN)) + .medActionType(beskyttetRessurs.actionType()) + .medAvailabilityType(beskyttetRessurs.availabilityType()) + .medResourceType(beskyttetRessurs.resourceType()) + .medSporingslogg(beskyttetRessurs.sporingslogg()) + .medPepId("local-app") + .medServicePath(ActionUthenter.action(RestClass.class, method)) + .medDataAttributter(dataAttributter) + .build(); + + } + + private static String toAuditdataPattern(String s) { + return Pattern.quote(s).replaceAll("__NUMBERS__", unquoteInReplacement("[0-9]*")); + } + + private static String unquoteInReplacement(String s) { + return "\\\\E" + s + "\\\\Q"; + } + + @Path("foo") + static class RestClass { + + @BeskyttetRessurs(actionType = ActionType.CREATE, resourceType = ResourceType.FAGSAK) + @Path("aktoer_in") + public void aktoerIn(@SuppressWarnings("unused") AktørDto param) { + // Test + } + + @BeskyttetRessurs(actionType = ActionType.CREATE, resourceType = ResourceType.FAGSAK) + @Path("behandling_id_in") + public void behandlingIdIn(@SuppressWarnings("unused") BehandlingIdDto param) { + // Test + } + + @BeskyttetRessurs(actionType = ActionType.CREATE, resourceType = ResourceType.FAGSAK, sporingslogg = false) + @Path("uten_sporingslogg") + public void utenSporingslogg(@SuppressWarnings("unused") BehandlingIdDto param) { + // Test + } + + } + + private record AktørDto(String aktørId) implements AbacDto { + + @Override + public AbacDataAttributter abacAttributter() { + return AbacDataAttributter.opprett().leggTil(StandardAbacAttributtType.AKTØR_ID, aktørId); + } + } + + private record BehandlingIdDto(Long id) implements AbacDto { + + @Override + public AbacDataAttributter abacAttributter() { + return AbacDataAttributter.opprett().leggTil(StandardAbacAttributtType.BEHANDLING_ID, id); + } + } + +} diff --git a/felles/abac/src/test/java/no/nav/vedtak/sikkerhet/abac/PepImplTest.java b/felles/abac/src/test/java/no/nav/vedtak/sikkerhet/abac/PepImplTest.java index e34a337ca..faaf174aa 100644 --- a/felles/abac/src/test/java/no/nav/vedtak/sikkerhet/abac/PepImplTest.java +++ b/felles/abac/src/test/java/no/nav/vedtak/sikkerhet/abac/PepImplTest.java @@ -43,6 +43,8 @@ class PepImplTest { @Mock private TokenProvider tokenProvider; @Mock + private AbacAuditlogger abacAuditlogger; + @Mock private PopulasjonKlient popKlientMock; @Mock private AnsattGruppeKlient gruppeKlientMock; @@ -61,7 +63,7 @@ static void avsluttEnv() { @BeforeEach void setUp() { - this.pep = new PepImpl(popKlientMock, gruppeKlientMock, pdpRequestBuilder); + this.pep = new PepImpl(abacAuditlogger, popKlientMock, gruppeKlientMock, pdpRequestBuilder); } @Test @@ -71,7 +73,7 @@ void skal_ikke_gi_tilgang_til_srvpdp_for_piptjeneste_siden_sts_brukere_ikke_stot when(pdpRequestBuilder.lagAppRessursData(any())).thenReturn(AppRessursData.builder().build()); - Tilgangsbeslutning permit = pep.vurderTilgang(attributter); + var permit = pep.vurderTilgang(attributter); assertThat(permit.fikkTilgang()).isFalse(); verifyNoInteractions(gruppeKlientMock); verifyNoInteractions(popKlientMock); @@ -84,7 +86,7 @@ void skal_nekte_tilgang_til_saksbehandler_for_piptjeneste() { when(pdpRequestBuilder.lagAppRessursData(any())).thenReturn(AppRessursData.builder().build()); - Tilgangsbeslutning permit = pep.vurderTilgang(attributter); + var permit = pep.vurderTilgang(attributter); assertThat(permit.fikkTilgang()).isFalse(); verifyNoInteractions(gruppeKlientMock); verifyNoInteractions(popKlientMock); @@ -98,7 +100,7 @@ void skal_gi_tilgang_for_intern_azure_cc() { when(pdpRequestBuilder.lagAppRessursData(any())).thenReturn(AppRessursData.builder().build()); - Tilgangsbeslutning permit = pep.vurderTilgang(attributter); + var permit = pep.vurderTilgang(attributter); assertThat(permit.fikkTilgang()).isTrue(); verifyNoInteractions(gruppeKlientMock); verifyNoInteractions(popKlientMock); @@ -113,7 +115,7 @@ void skal_gi_avslag_for_ekstern_azure_cc() { when(pdpRequestBuilder.lagAppRessursData(any())).thenReturn(AppRessursData.builder().build()); - Tilgangsbeslutning permit = pep.vurderTilgang(attributter); + var permit = pep.vurderTilgang(attributter); assertThat(permit.fikkTilgang()).isFalse(); verifyNoInteractions(gruppeKlientMock); verifyNoInteractions(popKlientMock); @@ -128,7 +130,7 @@ void skal_gi_avslag_for_godkjent_ekstern_azure_cc_men_i_feil_klusterklasse() { when(pdpRequestBuilder.lagAppRessursData(any())).thenReturn(AppRessursData.builder().build()); - Tilgangsbeslutning permit = pep.vurderTilgang(attributter); + var permit = pep.vurderTilgang(attributter); assertThat(permit.fikkTilgang()).isFalse(); verifyNoInteractions(gruppeKlientMock); verifyNoInteractions(popKlientMock); @@ -144,7 +146,7 @@ void skal_gi_tilgang_for_godkjent_ekstern_azure_cc() { when(pdpRequestBuilder.lagAppRessursData(any())).thenReturn(AppRessursData.builder().build()); - Tilgangsbeslutning permit = pep.vurderTilgang(attributter); + var permit = pep.vurderTilgang(attributter); assertThat(permit.fikkTilgang()).isTrue(); verifyNoInteractions(gruppeKlientMock); verifyNoInteractions(popKlientMock); @@ -159,7 +161,7 @@ void skal_kalle_pdp_for_annet_enn_pip_tjenester() { when(pdpRequestBuilder.lagAppRessursData(any())).thenReturn(appressursData); when(popKlientMock.vurderTilgangInternBruker(any(), any(), any())).thenReturn(Tilgangsvurdering.godkjenn()); - @SuppressWarnings("unused") Tilgangsbeslutning permit = pep.vurderTilgang(attributter); + @SuppressWarnings("unused") var permit = pep.vurderTilgang(attributter); verifyNoInteractions(gruppeKlientMock); verify(popKlientMock).vurderTilgangInternBruker(attributter.getBrukerOid(), Set.of(), appressursData.getAktørIdSet()); } diff --git a/felles/abac/src/test/java/no/nav/vedtak/sikkerhet/abac/internal/BeskyttetRessursInterceptorTest.java b/felles/abac/src/test/java/no/nav/vedtak/sikkerhet/abac/internal/BeskyttetRessursInterceptorTest.java index d12d4b525..30a967386 100644 --- a/felles/abac/src/test/java/no/nav/vedtak/sikkerhet/abac/internal/BeskyttetRessursInterceptorTest.java +++ b/felles/abac/src/test/java/no/nav/vedtak/sikkerhet/abac/internal/BeskyttetRessursInterceptorTest.java @@ -1,42 +1,38 @@ package no.nav.vedtak.sikkerhet.abac.internal; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.Map; -import java.util.regex.Pattern; +import java.util.Set; +import java.util.UUID; import jakarta.interceptor.InvocationContext; import jakarta.ws.rs.Path; -import org.assertj.core.api.Fail; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; -import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; -import no.nav.vedtak.exception.ManglerTilgangException; -import no.nav.vedtak.log.audit.Auditdata; -import no.nav.vedtak.log.audit.Auditlogger; -import no.nav.vedtak.sikkerhet.abac.AbacAuditlogger; import no.nav.vedtak.sikkerhet.abac.AbacDataAttributter; import no.nav.vedtak.sikkerhet.abac.AbacDto; import no.nav.vedtak.sikkerhet.abac.AbacResultat; import no.nav.vedtak.sikkerhet.abac.BeskyttetRessurs; import no.nav.vedtak.sikkerhet.abac.BeskyttetRessursInterceptor; +import no.nav.vedtak.sikkerhet.abac.Pep; +import no.nav.vedtak.sikkerhet.abac.PepNektetTilgangException; import no.nav.vedtak.sikkerhet.abac.StandardAbacAttributtType; -import no.nav.vedtak.sikkerhet.abac.Tilgangsbeslutning; import no.nav.vedtak.sikkerhet.abac.TokenProvider; import no.nav.vedtak.sikkerhet.abac.beskyttet.ActionType; +import no.nav.vedtak.sikkerhet.abac.beskyttet.AvailabilityType; import no.nav.vedtak.sikkerhet.abac.beskyttet.ResourceType; -import no.nav.vedtak.sikkerhet.abac.pdp.AppRessursData; +import no.nav.vedtak.sikkerhet.kontekst.IdentType; import no.nav.vedtak.sikkerhet.oidc.config.OpenIDProvider; import no.nav.vedtak.sikkerhet.oidc.token.OpenIDToken; import no.nav.vedtak.sikkerhet.oidc.token.TokenString; @@ -50,131 +46,99 @@ public class BeskyttetRessursInterceptorTest { private final AktørDto aktør1 = new AktørDto("00000000000"); private final BehandlingIdDto behandlingIdDto = new BehandlingIdDto(1234L); - private final ArgumentCaptor auditdataCaptor = ArgumentCaptor.forClass(Auditdata.class); + private static final String BRUKER_IDENT = "A000000"; + private static final UUID BRUKER_OID = UUID.randomUUID(); + private static final String PEP_ID = "test"; - public static final OpenIDToken DUMMY_OPENID_TOKEN = new OpenIDToken(OpenIDProvider.AZUREAD, new TokenString(DUMMY_ID_TOKEN)); + private final ArgumentCaptor braCaptor = ArgumentCaptor.forClass(BeskyttetRessursAttributter.class); + public static final OpenIDToken DUMMY_OPENID_TOKEN = new OpenIDToken(OpenIDProvider.TOKENX, new TokenString(DUMMY_ID_TOKEN)); + + @Mock + private TokenProvider tokenProvider; @Mock - private static TokenProvider tokenProvider; + private Pep pep; - private void mockTokenProvider() { - when(tokenProvider.getUid()).thenReturn("A000000"); + @BeforeEach + void mockTokenProvider() { + when(tokenProvider.getUid()).thenReturn(BRUKER_IDENT); + when(tokenProvider.getOid()).thenReturn(BRUKER_OID); + when(tokenProvider.getAnsattGrupper()).thenReturn(Set.of()); + when(tokenProvider.getIdentType()).thenReturn(IdentType.InternBruker); when(tokenProvider.openIdToken()).thenReturn(DUMMY_OPENID_TOKEN); + when(pep.pepId()).thenReturn(PEP_ID); } @Test - void auditlogg_skal_logge_parametre_som_går_til_pdp_til_sporingslogg_ved_permit() throws Exception { - final Auditlogger auditlogger = mockAuditLogger(); - final AbacAuditlogger abacAuditlogger = new AbacAuditlogger(auditlogger); - - skal_logge_parametre_som_går_til_pdp_til_sporingslogg_ved_permit(abacAuditlogger); - assertGotPattern(auditlogger, - "CEF:0|felles|felles-test|1.0|audit:create|ABAC Sporingslogg|INFO|act=create duid=00000000000 end=__NUMBERS__ request=/foo/aktoer_in requestContext=pip.tjeneste.kan.kun.kalles.av.pdp.servicebruker suid=A000000"); - } - - private void skal_logge_parametre_som_går_til_pdp_til_sporingslogg_ved_permit(AbacAuditlogger abacAuditLogger) throws Exception { - mockTokenProvider(); - - BeskyttetRessursInterceptor interceptor = new BeskyttetRessursInterceptor(attributter -> { - var ressurs = AppRessursData.builder().leggTilAktørId(aktør1.getAktørId()).build(); - return new Tilgangsbeslutning(AbacResultat.GODKJENT, attributter, ressurs); - }, abacAuditLogger, tokenProvider); + void godkjent_aktør() throws Exception { + when(pep.vurderTilgang(braCaptor.capture())).thenReturn(AbacResultat.GODKJENT); + var interceptor = new BeskyttetRessursInterceptor(pep, tokenProvider); Method method = RestClass.class.getMethod("aktoerIn", AktørDto.class); InvocationContext ic = new TestInvocationContext(method, new Object[]{aktør1}); interceptor.wrapTransaction(ic); - } - @Test - void auditlogg_skal_også_logge_input_parametre_til_sporingslogg_ved_permit() throws Exception { - final Auditlogger auditlogger = mockAuditLogger(); - final AbacAuditlogger abacAuditlogger = new AbacAuditlogger(auditlogger); - skal_også_logge_input_parametre_til_sporingslogg_ved_permit(abacAuditlogger); - assertGotPattern(auditlogger, - "CEF:0|felles|felles-test|1.0|audit:create|ABAC Sporingslogg|INFO|act=create duid=00000000000 end=__NUMBERS__ flexString2=1234 flexString2Label=Behandling request=/foo/behandling_id_in requestContext=pip.tjeneste.kan.kun.kalles.av.pdp.servicebruker suid=A000000"); + var bra = braCaptor.getValue(); + assertBeskyttetRessursAttributter(bra); + assertThat(bra.isSporingslogg()).isTrue(); } - private void skal_også_logge_input_parametre_til_sporingslogg_ved_permit(AbacAuditlogger abacAuditLogger) throws Exception { - mockTokenProvider(); - - BeskyttetRessursInterceptor interceptor = new BeskyttetRessursInterceptor(attributter -> { - var ressurs = AppRessursData.builder().leggTilAktørId(aktør1.getAktørId()).build(); - return new Tilgangsbeslutning(AbacResultat.GODKJENT, attributter, ressurs); - }, abacAuditLogger, tokenProvider); + @Test + void godkjent_behandling() throws Exception { + when(pep.vurderTilgang(braCaptor.capture())).thenReturn(AbacResultat.GODKJENT); + var interceptor = new BeskyttetRessursInterceptor(pep, tokenProvider); Method method = RestClass.class.getMethod("behandlingIdIn", BehandlingIdDto.class); InvocationContext ic = new TestInvocationContext(method, new Object[]{behandlingIdDto}); interceptor.wrapTransaction(ic); - } - @Test - void auditlog_skal_ikke_logge_parametre_som_går_til_pdp_til_sporingslogg_ved_permit_når_det_er_konfigurert_unntak_i_annotering() throws Exception { - when(tokenProvider.openIdToken()).thenReturn(DUMMY_OPENID_TOKEN); - final Auditlogger auditlogger = mock(Auditlogger.class); - final AbacAuditlogger abacAuditlogger = new AbacAuditlogger(auditlogger); - skal_ikke_logge_parametre_som_går_til_pdp_til_sporingslogg_ved_permit_når_det_er_konfigurert_unntak_i_annotering(abacAuditlogger); - verify(auditlogger, never()).logg(Mockito.any()); + var bra = braCaptor.getValue(); + assertBeskyttetRessursAttributter(bra); + assertThat(bra.isSporingslogg()).isTrue(); } - private void skal_ikke_logge_parametre_som_går_til_pdp_til_sporingslogg_ved_permit_når_det_er_konfigurert_unntak_i_annotering(AbacAuditlogger abacAuditLogger) throws Exception { - mockTokenProvider(); - BeskyttetRessursInterceptor interceptor = new BeskyttetRessursInterceptor(attributter -> { - var ressurs = AppRessursData.builder().leggTilAktørId(aktør1.getAktørId()).build(); - return new Tilgangsbeslutning(AbacResultat.GODKJENT, attributter, ressurs); - }, abacAuditLogger, tokenProvider); + + @Test + void godkjent_uten_sporing() throws Exception { + when(pep.vurderTilgang(braCaptor.capture())).thenReturn(AbacResultat.GODKJENT); + var interceptor = new BeskyttetRessursInterceptor(pep, tokenProvider); Method method = RestClass.class.getMethod("utenSporingslogg", BehandlingIdDto.class); InvocationContext ic = new TestInvocationContext(method, new Object[]{behandlingIdDto}); interceptor.wrapTransaction(ic); - } - @Test - void auditlog_skal_logge_parametre_som_går_til_pdp_til_sporingslogg_ved_deny() throws Exception { - mockTokenProvider(); - final Auditlogger auditlogger = mockAuditLogger(); - final AbacAuditlogger abacAuditlogger = new AbacAuditlogger(auditlogger); - skal_logge_parametre_som_går_til_pdp_til_sporingslogg_ved_deny(abacAuditlogger); - assertGotPattern(auditlogger, - "CEF:0|felles|felles-test|1.0|audit:create|ABAC Sporingslogg|WARN|act=create duid=00000000000 end=__NUMBERS__ request=/foo/aktoer_in requestContext=pip.tjeneste.kan.kun.kalles.av.pdp.servicebruker suid=A000000"); + var bra = braCaptor.getValue(); + assertBeskyttetRessursAttributter(bra); + assertThat(bra.isSporingslogg()).isFalse(); } - private void skal_logge_parametre_som_går_til_pdp_til_sporingslogg_ved_deny(AbacAuditlogger abacAuditLogger) throws Exception { - BeskyttetRessursInterceptor interceptor = new BeskyttetRessursInterceptor(attributter -> { - var ressurs = AppRessursData.builder().leggTilAktørId(aktør1.getAktørId()).build(); - return new Tilgangsbeslutning(AbacResultat.AVSLÅTT_KODE_6, attributter, ressurs); - }, abacAuditLogger, tokenProvider); + @Test + void deny_aktør_gir_exception() throws Exception { + when(pep.vurderTilgang(braCaptor.capture())).thenReturn(AbacResultat.AVSLÅTT_KODE_6); + var interceptor = new BeskyttetRessursInterceptor(pep, tokenProvider); Method method = RestClass.class.getMethod("aktoerIn", AktørDto.class); InvocationContext ic = new TestInvocationContext(method, new Object[]{aktør1}); + Assertions.assertThrowsExactly(PepNektetTilgangException.class, () -> interceptor.wrapTransaction(ic), () -> "F-709170:Tilgangskontroll.Avslag.Kode6"); - try { - interceptor.wrapTransaction(ic); - Fail.fail("Skal få exception"); - } catch (ManglerTilgangException e) { - // FORVENTET - } - } - - private void assertGotPattern(final Auditlogger auditlogger, String expected) { - verify(auditlogger).logg(auditdataCaptor.capture()); - final String actual = auditdataCaptor.getValue().toString(); - assertThat(actual).matches(toAuditdataPattern(expected)); - } - - private static Auditlogger mockAuditLogger() { - final Auditlogger auditlogger = mock(Auditlogger.class); - when(auditlogger.getDefaultVendor()).thenReturn("felles"); - when(auditlogger.getDefaultProduct()).thenReturn("felles-test"); - return auditlogger; - } - - private static final String toAuditdataPattern(String s) { - return Pattern.quote(s).replaceAll("__NUMBERS__", unquoteInReplacement("[0-9]*")); + var bra = braCaptor.getValue(); + assertBeskyttetRessursAttributter(bra); + assertThat(bra.isSporingslogg()).isTrue(); } - private static final String unquoteInReplacement(String s) { - return "\\\\E" + s + "\\\\Q"; + private void assertBeskyttetRessursAttributter(BeskyttetRessursAttributter bra) { + assertThat(bra.getBrukerId()).isEqualTo(BRUKER_IDENT); + assertThat(bra.getBrukerOid()).isEqualTo(BRUKER_OID); + assertThat(bra.getIdentType()).isEqualTo(IdentType.InternBruker); + assertThat(bra.getAnsattGrupper()).isEmpty(); + assertThat(bra.getActionType()).isEqualTo(ActionType.CREATE); + assertThat(bra.getResourceType()).isEqualTo(ResourceType.PIP); + assertThat(bra.getAvailabilityType()).isEqualTo(AvailabilityType.INTERNAL); + assertThat(bra.getPepId()).isEqualTo(PEP_ID); + assertThat(bra.getToken().getOpenIDProvider()).isEqualTo(OpenIDProvider.TOKENX); + assertThat(bra.getServicePath()).startsWith("/foo"); + assertThat(bra.getDataAttributter().keySet()).hasSize(1); } @Path("foo") @@ -200,17 +164,7 @@ public void utenSporingslogg(@SuppressWarnings("unused") BehandlingIdDto param) } - private static class AktørDto implements AbacDto { - - private String aktørId; - - public AktørDto(String aktørId) { - this.aktørId = aktørId; - } - - public String getAktørId() { - return aktørId; - } + private record AktørDto(String aktørId) implements AbacDto { @Override public AbacDataAttributter abacAttributter() { @@ -218,13 +172,7 @@ public AbacDataAttributter abacAttributter() { } } - private static class BehandlingIdDto implements AbacDto { - - private Long id; - - public BehandlingIdDto(Long id) { - this.id = id; - } + private record BehandlingIdDto(Long id) implements AbacDto { @Override public AbacDataAttributter abacAttributter() {