Skip to content

Commit 7e412a7

Browse files
committed
Klient for pdl-pip-api
1 parent c245944 commit 7e412a7

File tree

7 files changed

+391
-0
lines changed

7 files changed

+391
-0
lines changed

felles/pom.xml

+6
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
<module>abac-kontekst</module>
2929
<module>auth-filter</module>
3030
<module>server</module>
31+
<module>tilgang</module>
3132
</modules>
3233

3334
<dependencyManagement>
@@ -52,6 +53,11 @@
5253
<artifactId>felles-kontekst</artifactId>
5354
<version>${project.version}</version>
5455
</dependency>
56+
<dependency>
57+
<groupId>no.nav.foreldrepenger.felles</groupId>
58+
<artifactId>felles-tilgang</artifactId>
59+
<version>${project.version}</version>
60+
</dependency>
5561
<dependency>
5662
<groupId>no.nav.foreldrepenger.felles</groupId>
5763
<artifactId>felles-abac</artifactId>

felles/tilgang/pom.xml

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>felles</artifactId>
7+
<groupId>no.nav.foreldrepenger.felles</groupId>
8+
<version>0.0.0-SNAPSHOT</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
12+
<artifactId>felles-tilgang</artifactId>
13+
<name>Felles :: Tilgangskontroll</name>
14+
15+
16+
<dependencies>
17+
<dependency>
18+
<groupId>jakarta.enterprise</groupId>
19+
<artifactId>jakarta.enterprise.cdi-api</artifactId>
20+
</dependency>
21+
<dependency>
22+
<groupId>no.nav.foreldrepenger.felles</groupId>
23+
<artifactId>felles-oidc</artifactId>
24+
</dependency>
25+
<dependency>
26+
<groupId>jakarta.ws.rs</groupId>
27+
<artifactId>jakarta.ws.rs-api</artifactId>
28+
</dependency>
29+
</dependencies>
30+
31+
32+
</project>
33+
34+
35+
36+
37+
38+
39+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package no.nav.vedtak.sikkerhet.tilgang;
2+
3+
import java.util.List;
4+
import java.util.Map;
5+
6+
public interface TilgangPersondata {
7+
8+
// ident er aktørId eller personident
9+
TilgangPersondataDto hentTilgangPersondata(String ident);
10+
11+
// identer er aktørId eller personident. Respons er map fra personident til responsobjekt
12+
Map<String, TilgangPersondataDto> hentTilgangPersondataBolk(List<String> identer);
13+
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package no.nav.vedtak.sikkerhet.tilgang;
2+
3+
import java.time.LocalDate;
4+
import java.util.List;
5+
import java.util.Optional;
6+
7+
import com.fasterxml.jackson.annotation.JsonEnumDefaultValue;
8+
9+
public record TilgangPersondataDto(String aktoerId, Person person, Identer identer, GeografiskTilknytning geografiskTilknytning) {
10+
11+
public record Person(List<Adressebeskyttelse> adressebeskyttelse, List<Fødsel> foedsel,
12+
List<Dødsfall> doedsfall, List<Familierelasjoner> familierelasjoner) {
13+
}
14+
15+
public record Adressebeskyttelse(Gradering gradering) { }
16+
17+
public record Fødsel(LocalDate foedselsdato) { }
18+
19+
public record Dødsfall(LocalDate doedsdato) { }
20+
21+
public record Familierelasjoner(String relatertPersonsIdent) { } // FNR
22+
23+
public record Identer(List<Ident> identer) { }
24+
25+
public record Ident(String ident, Boolean historisk, IdentGruppe gruppe) { }
26+
27+
public record GeografiskTilknytning(GtType gtType, String gtKommune, String gtBydel, String gtLand, String regel) { }
28+
29+
public enum Gradering { STRENGT_FORTROLIG_UTLAND, STRENGT_FORTROLIG, FORTROLIG, @JsonEnumDefaultValue UDEFINERT }
30+
31+
public enum IdentGruppe { AKTORID, FOLKEREGISTERIDENT, NPID, @JsonEnumDefaultValue UDEFINERT }
32+
33+
public enum GtType { KOMMUNE, BYDEL, UTLAND, @JsonEnumDefaultValue UDEFINERT }
34+
35+
public boolean harStrengAdresseBeskyttelse() {
36+
return Optional.ofNullable(person()).map(Person::adressebeskyttelse).orElse(List.of()).stream()
37+
.map(Adressebeskyttelse::gradering)
38+
.anyMatch(g -> Gradering.STRENGT_FORTROLIG.equals(g) || Gradering.STRENGT_FORTROLIG_UTLAND.equals(g));
39+
}
40+
41+
public boolean harAdresseBeskyttelse() {
42+
return Optional.ofNullable(person()).map(Person::adressebeskyttelse).orElse(List.of()).stream()
43+
.map(Adressebeskyttelse::gradering)
44+
.anyMatch(g -> g != null && !Gradering.UDEFINERT.equals(g));
45+
}
46+
47+
public boolean erIkkeMyndig() {
48+
return Optional.ofNullable(person()).map(Person::foedsel).orElse(List.of()).stream()
49+
.map(Fødsel::foedselsdato)
50+
.anyMatch(f -> f == null || f.plusYears(18).isAfter(LocalDate.now()));
51+
}
52+
53+
public String personIdent() {
54+
return Optional.ofNullable(identer()).map(Identer::identer).orElse(List.of()).stream()
55+
.filter(i -> IdentGruppe.FOLKEREGISTERIDENT.equals(i.gruppe()))
56+
.filter(i -> !i.historisk())
57+
.map(Ident::ident)
58+
.findFirst().orElse(null);
59+
}
60+
61+
public List<String> personIdenter() {
62+
return Optional.ofNullable(identer()).map(Identer::identer).orElse(List.of()).stream()
63+
.filter(i -> IdentGruppe.FOLKEREGISTERIDENT.equals(i.gruppe()))
64+
.map(Ident::ident)
65+
.toList();
66+
}
67+
68+
public String aktørId() {
69+
return Optional.ofNullable(identer()).map(Identer::identer).orElse(List.of()).stream()
70+
.filter(i -> IdentGruppe.AKTORID.equals(i.gruppe()))
71+
.filter(i -> !i.historisk())
72+
.map(Ident::ident)
73+
.findFirst().orElse(null);
74+
}
75+
76+
public List<String> aktørIdMedHistoriske() {
77+
return Optional.ofNullable(identer()).map(Identer::identer).orElse(List.of()).stream()
78+
.filter(i -> IdentGruppe.AKTORID.equals(i.gruppe()))
79+
.map(Ident::ident)
80+
.toList();
81+
}
82+
83+
public boolean harNasjonalTilknytning() {
84+
return Optional.ofNullable(geografiskTilknytning()).map(GeografiskTilknytning::gtType)
85+
.filter(gtt -> GtType.KOMMUNE.equals(gtt) || GtType.BYDEL.equals(gtt))
86+
.isPresent();
87+
}
88+
89+
public boolean harIkkeNasjonalTilknytning() {
90+
return Optional.ofNullable(geografiskTilknytning()).map(GeografiskTilknytning::gtType)
91+
.filter(gtt -> GtType.KOMMUNE.equals(gtt) || GtType.BYDEL.equals(gtt))
92+
.isEmpty();
93+
}
94+
95+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package no.nav.vedtak.sikkerhet.tilgang;
2+
3+
import java.net.URI;
4+
import java.net.http.HttpRequest;
5+
import java.time.Duration;
6+
import java.util.List;
7+
import java.util.Map;
8+
9+
import jakarta.enterprise.context.ApplicationScoped;
10+
import jakarta.inject.Inject;
11+
import jakarta.ws.rs.core.HttpHeaders;
12+
import jakarta.ws.rs.core.MediaType;
13+
import no.nav.foreldrepenger.konfig.KonfigVerdi;
14+
import no.nav.vedtak.klient.http.DefaultHttpClient;
15+
import no.nav.vedtak.klient.http.HttpClientRequest;
16+
import no.nav.vedtak.mapper.json.DefaultJsonMapper;
17+
import no.nav.vedtak.sikkerhet.oidc.config.OpenIDProvider;
18+
import no.nav.vedtak.sikkerhet.oidc.token.TokenProvider;
19+
20+
/*
21+
* Informasjon fra PDL til bruk kun for tilgangskontroll
22+
*
23+
* PROD: SD innenfor FSS ellers https pdl-pip-api.intern.nav.no (scope: prod-fss:pdl:pdl-pip-api)
24+
* DEV: SD innenfor FSS ellers https pdl-pip-api.dev.intern.nav.no (scope: dev-fss:pdl:pdl-pip-api)
25+
*/
26+
@ApplicationScoped
27+
public class TilgangPersondataKlient implements TilgangPersondata {
28+
29+
private static final String OIDC_AUTH_HEADER_PREFIX = "Bearer ";
30+
31+
private static final String BOLK_SUFFIX = "Bolk";
32+
33+
private URI personURI;
34+
private URI personBolkURI;
35+
private String personScopes;
36+
37+
38+
TilgangPersondataKlient() {
39+
} // CDI
40+
41+
@Inject
42+
public TilgangPersondataKlient(@KonfigVerdi(value = "pdl.pip.endpoint.url", defaultVerdi = "http://pdl-pip-api.pdll/api/v1/person") String pdlPipUrl,
43+
@KonfigVerdi(value = "pdl.pip.scopes", defaultVerdi = "api://prod-fss:pdl:pdl-pip-api/.default") String pdlPipScopes) {
44+
this.personURI = URI.create(pdlPipUrl);
45+
this.personBolkURI = URI.create(pdlPipUrl + BOLK_SUFFIX);
46+
this.personScopes = pdlPipScopes;
47+
}
48+
49+
@Override
50+
public TilgangPersondataDto hentTilgangPersondata(String ident) {
51+
var builder = HttpRequest.newBuilder(personURI)
52+
.header(HttpHeaders.ACCEPT, MediaType.WILDCARD) // Bruk APPLICATION_JSON ?
53+
.header(HttpHeaders.AUTHORIZATION, OIDC_AUTH_HEADER_PREFIX + TokenProvider.getTokenForSystem(OpenIDProvider.AZUREAD, personScopes).token())
54+
.header("ident", ident)
55+
.timeout(Duration.ofSeconds(5))
56+
.GET();
57+
var request = new PersondataRequest(builder);
58+
59+
var response = DefaultHttpClient.client().send(request);
60+
return response != null ? DefaultJsonMapper.fromJson(response, TilgangPersondataDto.class) : null;
61+
}
62+
63+
@Override
64+
public Map<String, TilgangPersondataDto> hentTilgangPersondataBolk(List<String> identer) {
65+
var builder = HttpRequest.newBuilder(personBolkURI)
66+
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
67+
.header(HttpHeaders.ACCEPT, MediaType.WILDCARD) // Bruk APPLICATION_JSON ?
68+
.header(HttpHeaders.AUTHORIZATION, OIDC_AUTH_HEADER_PREFIX + TokenProvider.getTokenForSystem(OpenIDProvider.AZUREAD, personScopes).token())
69+
.timeout(Duration.ofSeconds(5))
70+
.POST(HttpRequest.BodyPublishers.ofString(DefaultJsonMapper.toJson(identer)));
71+
var request = new PersondataRequest(builder);
72+
73+
var response = DefaultHttpClient.client().send(request);
74+
return response != null ? DefaultJsonMapper.mapFromJson(response, TilgangPersondataDto.class) : Map.of();
75+
}
76+
77+
78+
private static class PersondataRequest extends HttpClientRequest {
79+
public PersondataRequest(HttpRequest.Builder builder) {
80+
super(builder, Map.of());
81+
}
82+
}
83+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<beans xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/beans_3_0.xsd"
4+
version="3.0"
5+
bean-discovery-mode="annotated">
6+
</beans>

0 commit comments

Comments
 (0)