Skip to content

Commit b23f478

Browse files
authored
Ny tilgangskontroll, i parallell med eksisterende (#202)
* Parallel kjøring av ny tilgangskontroll * Endret konfig tilbake
1 parent f8a3cea commit b23f478

File tree

9 files changed

+184
-9
lines changed

9 files changed

+184
-9
lines changed

deploy/dev-gcp.yml

+7
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ spec:
8484
- "NAVident"
8585
accessPolicy:
8686
outbound:
87+
rules:
88+
- application: sif-abac-pdp
8789
external:
8890
- host: "k9-abakus.dev-fss-pub.nais.io"
8991
- host: "k9-oppdrag.dev-fss-pub.nais.io"
@@ -113,6 +115,7 @@ spec:
113115
- application: k9-abakus
114116
namespace: k9saksbehandling
115117
cluster: dev-fss
118+
- application: sif-abac-pdp
116119
gcp:
117120
sqlInstances:
118121
- type: POSTGRES_16
@@ -239,6 +242,10 @@ spec:
239242
value : https://pdl-pip-api.dev-fss-pub.nais.io/api/v1/person
240243
- name : PDL_PIP_SCOPE
241244
value : api://dev-fss.pdl.pdl-pip-api/.default
245+
- name : SIF_ABAC_PDP_SCOPE
246+
value : api://dev-gcp.k9saksbehandling.sif-abac-pdp/.default
247+
- name : SIF_ABAC_PDP_URL
248+
value : http://sif-abac-pdp/sif/sif-abac-pdp/api/tilgangskontroll/ung/saksinformasjon
242249

243250
# Saf
244251
- name: SAF_BASE_URL

deploy/prod-gcp.yml

+13-6
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ spec:
8484
- "NAVident"
8585
accessPolicy:
8686
outbound:
87+
rules:
88+
- application : sif-abac-pdp
8789
external:
8890
- host: "k9-abakus.prod-fss-pub.nais.io"
8991
- host: "k9-oppdrag.prod-fss-pub.nais.io"
@@ -93,24 +95,26 @@ spec:
9395
- host: "saf.prod-fss-pub.nais.io"
9496
- host: "norg2.prod-fss-pub.nais.io"
9597
- host: "dokarkiv.prod-fss-pub.nais.io"
98+
- host: "k9-fordel.prod-fss-pub.nais.io"
9699
inbound:
97100
rules:
98101
- application: ung-sak
99102
- application: k9-los-api
100103
namespace: k9saksbehandling
101-
cluster: prod-gcp
104+
cluster: prod-fss
102105
- application: k9-fordel
103106
namespace: k9saksbehandling
104-
cluster: prod-gcp
107+
cluster: prod-fss
105108
- application: k9-tilbake
106109
namespace: k9saksbehandling
107-
cluster: prod-gcp
110+
cluster: prod-fss
108111
- application: k9-klage
109112
namespace: k9saksbehandling
110-
cluster: prod-gcp
113+
cluster: prod-fss
111114
- application: k9-abakus
112115
namespace: k9saksbehandling
113-
cluster: prod-gcp
116+
cluster: prod-fss
117+
- application: sif-abac-pdp
114118
gcp:
115119
sqlInstances:
116120
- type: POSTGRES_16
@@ -224,7 +228,10 @@ spec:
224228
value : https://pdl-pip-api.prod-fss-pub.nais.io/api/v1/person
225229
- name : PDL_PIP_SCOPE
226230
value : api://prod-fss.pdl.pdl-pip-api/.default
227-
231+
- name: SIF_ABAC_PDP_SCOPE
232+
value: api://prod-gcp.k9saksbehandling.sif-abac-pdp/.default
233+
- name: SIF_ABAC_PDP_URL
234+
value: http://sif-abac-pdp/sif/sif-abac-pdp/api/tilgangskontroll/ung/saksinformasjon
228235

229236
# Saf
230237
- name: SAF_BASE_URL

pom.xml

+5
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,11 @@
320320
<version>${project.version}</version>
321321
</dependency>
322322

323+
<dependency>
324+
<groupId>no.nav.sif.abac</groupId>
325+
<artifactId>kontrakt</artifactId>
326+
<version>1.0.3</version>
327+
</dependency>
323328

324329
<dependency>
325330
<groupId>no.nav.k9</groupId>

web/app-vtp.properties

+2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ DOKDISTFORDELING_URL=http://localhost:8060/rest/dokdist/v1
1919
DOKARKIV_URL=http://localhost:8060/rest/dokarkiv/rest/journalpostapi/v1
2020
DOKARKIV_BASE_URL=https://vtp:8063/rest/dokarkiv
2121

22+
sif.abac.pdp.scope=api://vtp.k9saksbehandling.sif-abac-pdp/.default
23+
sif.abac.pdp.url=http://localhost:8913/sif/sif-abac-pdp/api/tilgangskontroll/ung/saksinformasjon
2224
k9.oppdrag.direkte.url=http://localhost:8070/k9/oppdrag/api
2325
K9.oppdrag.scope=api://vtp.k9saksbehandling.k9-oppdrag/.default
2426
k9.tilbake.direkte.url=http://localhost:8031/k9/tilbake/api

web/pom.xml

+4
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,10 @@
327327
<groupId>no.nav.ung.sak</groupId>
328328
<artifactId>mottak</artifactId>
329329
</dependency>
330+
<dependency>
331+
<groupId>no.nav.sif.abac</groupId>
332+
<artifactId>kontrakt</artifactId>
333+
</dependency>
330334
</dependencies>
331335

332336
<build>

web/src/main/java/no/nav/ung/sak/web/server/abac/AppPdpKlient.java

+35-2
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,58 @@
44
import jakarta.enterprise.context.Dependent;
55
import jakarta.enterprise.inject.Alternative;
66
import jakarta.inject.Inject;
7+
import no.nav.k9.felles.konfigurasjon.env.Environment;
8+
import no.nav.k9.felles.sikkerhet.abac.Decision;
79
import no.nav.k9.felles.sikkerhet.abac.PdpKlient;
810
import no.nav.k9.felles.sikkerhet.abac.PdpRequest;
911
import no.nav.k9.felles.sikkerhet.abac.Tilgangsbeslutning;
12+
import no.nav.sif.abac.kontrakt.abac.dto.SaksinformasjonTilgangskontrollInputDto;
1013
import no.nav.ung.sak.tilgangskontroll.PolicyDecisionPoint;
14+
import org.slf4j.Logger;
15+
import org.slf4j.LoggerFactory;
16+
17+
import java.util.Set;
1118

1219
@Dependent
1320
@Alternative
1421
@Priority(1)
1522
public class AppPdpKlient implements PdpKlient {
1623

24+
private static final Logger LOG = LoggerFactory.getLogger(AppPdpKlient.class);
25+
1726
private final PolicyDecisionPoint pdp;
27+
private final SifAbacPdpRestKlient sifAbacPdpRestKlient;
1828

1929
@Inject
20-
public AppPdpKlient(PolicyDecisionPoint pdp) {
30+
public AppPdpKlient(PolicyDecisionPoint pdp, SifAbacPdpRestKlient sifAbacPdpRestKlient) {
2131
this.pdp = pdp;
32+
this.sifAbacPdpRestKlient = sifAbacPdpRestKlient;
2233
}
2334

2435
@Override
2536
public Tilgangsbeslutning forespørTilgang(PdpRequest pdpRequest) {
26-
return pdp.vurderTilgangForInnloggetBruker(pdpRequest);
37+
Tilgangsbeslutning tilgangsbeslutning = pdp.vurderTilgangForInnloggetBruker(pdpRequest);
38+
39+
try {
40+
Tilgangsbeslutning eksterntSvar = forespørTilgangEksternt(pdpRequest);
41+
if (eksterntSvar.fikkTilgang() != tilgangsbeslutning.fikkTilgang()) {
42+
LOG.warn("Ulikt svar på tilgang. Intern {} og ekstern {}", tilgangsbeslutning.fikkTilgang(), eksterntSvar.fikkTilgang());
43+
if (Environment.current().isDev()) {
44+
LOG.info("Forespørsel som gav ulikt svar var: {}", pdpRequest);
45+
}
46+
}
47+
} catch (Exception e) {
48+
LOG.warn("Feil med ekstern tilgangskontroll", e);
49+
}
50+
51+
return tilgangsbeslutning;
2752
}
53+
54+
public Tilgangsbeslutning forespørTilgangEksternt(PdpRequest pdpRequest) {
55+
SaksinformasjonTilgangskontrollInputDto tilgangskontrollInput = PdpRequestMapper.map(pdpRequest);
56+
Decision decision = sifAbacPdpRestKlient.sjekkTilgangForInnloggetBruker(tilgangskontrollInput);
57+
return new Tilgangsbeslutning(decision == Decision.Permit, Set.of(), pdpRequest);
58+
}
59+
2860
}
61+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package no.nav.ung.sak.web.server.abac;
2+
3+
import no.nav.k9.felles.sikkerhet.abac.PdpRequest;
4+
import no.nav.sif.abac.kontrakt.abac.*;
5+
import no.nav.sif.abac.kontrakt.abac.dto.OperasjonDto;
6+
import no.nav.sif.abac.kontrakt.abac.dto.SaksinformasjonDto;
7+
import no.nav.sif.abac.kontrakt.abac.dto.SaksinformasjonTilgangskontrollInputDto;
8+
import no.nav.sif.abac.kontrakt.person.AktørId;
9+
import no.nav.sif.abac.kontrakt.person.PersonIdent;
10+
import no.nav.ung.sak.tilgangskontroll.api.AbacAttributter;
11+
12+
import java.util.Arrays;
13+
14+
public class PdpRequestMapper {
15+
16+
public static SaksinformasjonTilgangskontrollInputDto map(PdpRequest pdpRequest){
17+
return new SaksinformasjonTilgangskontrollInputDto(
18+
pdpRequest.getListOfString(AbacAttributter.RESOURCE_FELLES_PERSON_AKTOERID_RESOURCE).stream().map(AktørId::new).toList(),
19+
pdpRequest.getListOfString(AbacAttributter.RESOURCE_FELLES_PERSON_FNR).stream().map(PersonIdent::new).toList(),
20+
operasjon(pdpRequest),
21+
saksinformasjon(pdpRequest)
22+
);
23+
}
24+
25+
public static OperasjonDto operasjon(PdpRequest pdpRequest) {
26+
ResourceType resource = resourceTypeFraKode(pdpRequest.getString(no.nav.ung.sak.tilgangskontroll.api.AbacAttributter.RESOURCE_FELLES_RESOURCE_TYPE));
27+
return new OperasjonDto(resource, actionFraKode(pdpRequest.getString(no.nav.ung.sak.tilgangskontroll.api.AbacAttributter.XACML_1_0_ACTION_ACTION_ID)));
28+
}
29+
30+
public static SaksinformasjonDto saksinformasjon(PdpRequest pdpRequest) {
31+
return new SaksinformasjonDto(
32+
pdpRequest.getString(no.nav.ung.sak.tilgangskontroll.api.AbacAttributter.RESOURCE_K9_SAK_ANSVARLIG_SAKSBEHANDLER),
33+
Arrays.stream(AbacBehandlingStatus.values())
34+
.filter(v -> v.getEksternKode().equals(pdpRequest.getString(no.nav.ung.sak.tilgangskontroll.api.AbacAttributter.RESOURCE_K9_SAK_BEHANDLINGSSTATUS)))
35+
.findFirst().orElse(null),
36+
Arrays.stream(AbacFagsakStatus.values())
37+
.filter(v -> v.getEksternKode().equals(pdpRequest.getString(no.nav.ung.sak.tilgangskontroll.api.AbacAttributter.RESOURCE_K9_SAK_SAKSSTATUS)))
38+
.findFirst().orElse(null),
39+
aksjonspunktTypeFraKode(pdpRequest.getString(no.nav.ung.sak.tilgangskontroll.api.AbacAttributter.RESOURCE_K9_SAK_AKSJONSPUNKT_TYPE)));
40+
}
41+
42+
private static AksjonspunktType aksjonspunktTypeFraKode(String kode) {
43+
return switch (kode) {
44+
case null -> null;
45+
case "AUTO" -> AksjonspunktType.AUTOPUNKT;
46+
case "MANU" -> AksjonspunktType.MANUELL;
47+
case "OVST" -> AksjonspunktType.OVERSTYRING;
48+
case "SAOV" -> AksjonspunktType.SAKSBEHANDLEROVERSTYRING;
49+
default -> throw new IllegalStateException("Unexpected value: " + kode);
50+
};
51+
}
52+
53+
static ResourceType resourceTypeFraKode(String kode) {
54+
return switch (kode) {
55+
case no.nav.ung.abac.BeskyttetRessursKoder.APPLIKASJON -> ResourceType.APPLIKASJON;
56+
case no.nav.ung.abac.BeskyttetRessursKoder.FAGSAK -> ResourceType.FAGSAK;
57+
case no.nav.ung.abac.BeskyttetRessursKoder.DRIFT -> ResourceType.DRIFT;
58+
case no.nav.ung.abac.BeskyttetRessursKoder.VENTEFRIST -> ResourceType.VENTEFRIST;
59+
default -> throw new IllegalArgumentException("Ikke-støttet verdi: " + kode);
60+
};
61+
}
62+
63+
static BeskyttetRessursActionAttributt actionFraKode(String kode) {
64+
return switch (kode) {
65+
case "read" -> BeskyttetRessursActionAttributt.READ;
66+
case "update" -> BeskyttetRessursActionAttributt.UPDATE;
67+
case "create" -> BeskyttetRessursActionAttributt.CREATE;
68+
default -> throw new IllegalArgumentException("Ikke-styttet verdi: " + kode);
69+
};
70+
}
71+
72+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package no.nav.ung.sak.web.server.abac;
2+
3+
import jakarta.enterprise.context.Dependent;
4+
import jakarta.inject.Inject;
5+
import no.nav.k9.felles.integrasjon.rest.OidcRestClient;
6+
import no.nav.k9.felles.integrasjon.rest.ScopedRestIntegration;
7+
import no.nav.k9.felles.konfigurasjon.konfig.KonfigVerdi;
8+
import no.nav.k9.felles.sikkerhet.abac.Decision;
9+
import no.nav.sif.abac.kontrakt.abac.dto.SaksinformasjonTilgangskontrollInputDto;
10+
11+
import java.net.URI;
12+
import java.net.URISyntaxException;
13+
14+
@Dependent
15+
@ScopedRestIntegration(scopeKey = "sif.abac.pdp.scope", defaultScope = "api://prod-fss.k9saksbehandling.sif-abac-pdp/.default")
16+
public class SifAbacPdpRestKlient {
17+
18+
private OidcRestClient restClient;
19+
private URI uriSaksinformasjon;
20+
21+
SifAbacPdpRestKlient() {
22+
// for CDI proxy
23+
}
24+
25+
@Inject
26+
public SifAbacPdpRestKlient(OidcRestClient restClient,
27+
@KonfigVerdi(value = "sif.abac.pdp.url", defaultVerdi = "http://sif-abac-pdp/sif/sif-abac-pdp/api/tilgangskontroll/ung/saksinformasjon") String urlSifAbacPdp) {
28+
29+
this.restClient = restClient;
30+
this.uriSaksinformasjon = tilUri(urlSifAbacPdp);
31+
}
32+
33+
public Decision sjekkTilgangForInnloggetBruker(SaksinformasjonTilgangskontrollInputDto input) {
34+
return restClient.post(uriSaksinformasjon, input, Decision.class);
35+
}
36+
37+
private static URI tilUri(String baseUrl) {
38+
try {
39+
return new URI(baseUrl);
40+
} catch (URISyntaxException e) {
41+
throw new IllegalArgumentException("Ugyldig konfigurasjon for URL_K9TILBAKE", e);
42+
}
43+
}
44+
45+
}

web/src/test/java/no/nav/ung/sak/web/app/exceptions/JsonMappingExceptionMapperTest.java web/src/test/java/no/nav/ung/sak/web/app/exceptions/JsonPdpRequestMapperExceptionMapperTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
import no.nav.ung.sak.kontrakt.FeilDto;
1212

13-
public class JsonMappingExceptionMapperTest {
13+
public class JsonPdpRequestMapperExceptionMapperTest {
1414

1515
@Test
1616
public void skal_mappe_InvalidTypeIdException() throws Exception {

0 commit comments

Comments
 (0)