diff --git a/web/app-vtp.properties b/web/app-vtp.properties
index a7bad70612..425673f453 100644
--- a/web/app-vtp.properties
+++ b/web/app-vtp.properties
@@ -45,6 +45,7 @@ abac.pdp.endpoint.url=https://localhost:8063/rest/asm-pdp/authorize
azure.app.well.known.url=http://vtp:8060/rest/azuread/.well-known/openid-configuration
azure.app.client.id=vtp
azure.app.client.secret=hemmelig
+azure.app.tenant.id=vtp
CLIENT_SCOPE=api://vtp.k9saksbehandling.ung-sak/.default
# TOKEN X
diff --git a/web/pom.xml b/web/pom.xml
index 8cb6961f92..9573388c3d 100644
--- a/web/pom.xml
+++ b/web/pom.xml
@@ -16,6 +16,8 @@
5.18.1
12.0.15
+ 6.20.0
+ 1.14.2
@@ -285,6 +287,16 @@
test
+
+ com.microsoft.graph
+ microsoft-graph
+ ${microsoft-graph.version}
+
+
+ com.azure
+ azure-identity
+ ${azure-identity.version}
+
diff --git a/web/src/main/java/no/nav/ung/sak/web/app/tjenester/microsoftgraph/MSGraphBruker.java b/web/src/main/java/no/nav/ung/sak/web/app/tjenester/microsoftgraph/MSGraphBruker.java
new file mode 100644
index 0000000000..d390028d2e
--- /dev/null
+++ b/web/src/main/java/no/nav/ung/sak/web/app/tjenester/microsoftgraph/MSGraphBruker.java
@@ -0,0 +1,9 @@
+package no.nav.ung.sak.web.app.tjenester.microsoftgraph;
+
+import com.microsoft.graph.models.Group;
+import com.microsoft.graph.models.User;
+
+import java.util.List;
+
+public record MSGraphBruker(User bruker, List grupper) {
+}
diff --git a/web/src/main/java/no/nav/ung/sak/web/app/tjenester/microsoftgraph/MicrosoftGraphClientConfig.java b/web/src/main/java/no/nav/ung/sak/web/app/tjenester/microsoftgraph/MicrosoftGraphClientConfig.java
new file mode 100644
index 0000000000..2609523d2c
--- /dev/null
+++ b/web/src/main/java/no/nav/ung/sak/web/app/tjenester/microsoftgraph/MicrosoftGraphClientConfig.java
@@ -0,0 +1,35 @@
+package no.nav.ung.sak.web.app.tjenester.microsoftgraph;
+
+import com.azure.identity.ClientSecretCredential;
+import com.azure.identity.ClientSecretCredentialBuilder;
+import com.microsoft.graph.serviceclient.GraphServiceClient;
+import jakarta.enterprise.context.Dependent;
+import jakarta.inject.Inject;
+import no.nav.k9.felles.konfigurasjon.konfig.KonfigVerdi;
+
+@Dependent
+public class MicrosoftGraphClientConfig {
+ private final GraphServiceClient graphClient;
+
+ final String[] scopes = new String[] { "https://graph.microsoft.com/.default" };
+
+ @Inject
+ public MicrosoftGraphClientConfig(
+ @KonfigVerdi(value = "AZURE_APP_CLIENT_ID") String clientId,
+ @KonfigVerdi(value = "AZURE_APP_CLIENT_SECRET") String clientSecret,
+ @KonfigVerdi(value = "AZURE_APP_TENANT_ID") String tenantId
+ ) {
+
+ final ClientSecretCredential credential = new ClientSecretCredentialBuilder()
+ .tenantId(tenantId)
+ .clientId(clientId)
+ .clientSecret(clientSecret)
+ .build();
+
+ this.graphClient = new GraphServiceClient(credential, scopes);
+ }
+
+ public GraphServiceClient getGraphClient() {
+ return graphClient;
+ }
+}
diff --git a/web/src/main/java/no/nav/ung/sak/web/app/tjenester/microsoftgraph/MicrosoftGraphTjeneste.java b/web/src/main/java/no/nav/ung/sak/web/app/tjenester/microsoftgraph/MicrosoftGraphTjeneste.java
new file mode 100644
index 0000000000..6db7b3630c
--- /dev/null
+++ b/web/src/main/java/no/nav/ung/sak/web/app/tjenester/microsoftgraph/MicrosoftGraphTjeneste.java
@@ -0,0 +1,46 @@
+package no.nav.ung.sak.web.app.tjenester.microsoftgraph;
+
+import com.microsoft.graph.models.DirectoryObject;
+import com.microsoft.graph.models.Group;
+import com.microsoft.graph.models.GroupCollectionResponse;
+import com.microsoft.graph.models.User;
+import com.microsoft.graph.serviceclient.GraphServiceClient;
+import jakarta.enterprise.context.Dependent;
+import jakarta.inject.Inject;
+
+import java.util.List;
+import java.util.Objects;
+
+@Dependent
+public class MicrosoftGraphTjeneste {
+
+ private final GraphServiceClient graphClient;
+
+
+ @Inject
+ public MicrosoftGraphTjeneste(MicrosoftGraphClientConfig microsoftGraphClientConfig) {
+ this.graphClient = microsoftGraphClientConfig.getGraphClient();
+ }
+
+ public MSGraphBruker getUserInfoFromGraph(String userPrincipalName) {
+ User user = graphClient.users().byUserId(userPrincipalName).get();
+
+ return new MSGraphBruker(user, getUserGroupsFromGraph(userPrincipalName));
+ }
+
+ public List getUserGroupsFromGraph(String userPrincipalName) {
+ GroupCollectionResponse groupCollectionResponse = graphClient
+ .users()
+ .byUserId(userPrincipalName)
+ .memberOf()
+ .graphGroup()
+ .get();
+
+ return Objects.requireNonNull(groupCollectionResponse.getValue())
+ .stream()
+ .filter(Objects::nonNull)
+ .map(DirectoryObject.class::cast)
+ .map(Group.class::cast)
+ .toList();
+ }
+}
diff --git a/web/src/main/java/no/nav/ung/sak/web/app/tjenester/saksbehandler/NavAnsattRestTjeneste.java b/web/src/main/java/no/nav/ung/sak/web/app/tjenester/saksbehandler/NavAnsattRestTjeneste.java
index b974190041..62e9168250 100644
--- a/web/src/main/java/no/nav/ung/sak/web/app/tjenester/saksbehandler/NavAnsattRestTjeneste.java
+++ b/web/src/main/java/no/nav/ung/sak/web/app/tjenester/saksbehandler/NavAnsattRestTjeneste.java
@@ -1,11 +1,7 @@
package no.nav.ung.sak.web.app.tjenester.saksbehandler;
-import static no.nav.k9.abac.BeskyttetRessursKoder.APPLIKASJON;
-import static no.nav.k9.felles.sikkerhet.abac.BeskyttetRessursActionAttributt.READ;
-import static no.nav.k9.felles.sikkerhet.abac.PepImpl.ENV;
-
-import java.util.Collection;
-
+import com.microsoft.graph.models.Group;
+import io.swagger.v3.oas.annotations.Operation;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
@@ -13,24 +9,33 @@
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
-
-import org.apache.commons.lang3.BooleanUtils;
-
-import io.swagger.v3.oas.annotations.Operation;
-import no.nav.ung.sak.kontrakt.abac.InnloggetAnsattDto;
-import no.nav.ung.sak.web.app.util.LdapUtil;
import no.nav.k9.felles.integrasjon.ldap.LdapBruker;
import no.nav.k9.felles.integrasjon.ldap.LdapBrukeroppslag;
import no.nav.k9.felles.konfigurasjon.konfig.KonfigVerdi;
import no.nav.k9.felles.sikkerhet.abac.BeskyttetRessurs;
import no.nav.k9.sikkerhet.context.SubjectHandler;
+import no.nav.ung.sak.kontrakt.abac.InnloggetAnsattDto;
+import no.nav.ung.sak.web.app.tjenester.microsoftgraph.MSGraphBruker;
+import no.nav.ung.sak.web.app.tjenester.microsoftgraph.MicrosoftGraphTjeneste;
+import no.nav.ung.sak.web.app.util.LdapUtil;
+import org.apache.commons.lang3.BooleanUtils;
import org.slf4j.Logger;
+import java.util.Collection;
+import java.util.List;
+
+import static no.nav.k9.abac.BeskyttetRessursKoder.APPLIKASJON;
+import static no.nav.k9.felles.sikkerhet.abac.BeskyttetRessursActionAttributt.READ;
+import static no.nav.k9.felles.sikkerhet.abac.PepImpl.ENV;
+
@Path("/nav-ansatt")
@ApplicationScoped
@Transactional
public class NavAnsattRestTjeneste {
public static final String NAV_ANSATT_PATH = "/nav-ansatt";
+ private static final Logger log = org.slf4j.LoggerFactory.getLogger(NavAnsattRestTjeneste.class);
+
+ private MicrosoftGraphTjeneste msGraphTjeneste;
private String gruppenavnSaksbehandler;
private String gruppenavnVeileder;
@@ -41,8 +46,6 @@ public class NavAnsattRestTjeneste {
private String gruppenavnKode7;
private boolean skalViseDetaljerteFeilmeldinger;
- private static final Logger log = org.slf4j.LoggerFactory.getLogger(NavAnsattRestTjeneste.class);
-
public NavAnsattRestTjeneste() {
//NOSONAR
}
@@ -56,7 +59,8 @@ public NavAnsattRestTjeneste(
@KonfigVerdi(value = "bruker.gruppenavn.egenansatt") String gruppenavnEgenAnsatt,
@KonfigVerdi(value = "bruker.gruppenavn.kode6") String gruppenavnKode6,
@KonfigVerdi(value = "bruker.gruppenavn.kode7") String gruppenavnKode7,
- @KonfigVerdi(value = "vise.detaljerte.feilmeldinger", defaultVerdi = "true") Boolean viseDetaljerteFeilmeldinger
+ @KonfigVerdi(value = "vise.detaljerte.feilmeldinger", defaultVerdi = "true") Boolean viseDetaljerteFeilmeldinger,
+ MicrosoftGraphTjeneste microsoftGraphTjeneste
) {
this.gruppenavnSaksbehandler = gruppenavnSaksbehandler;
this.gruppenavnVeileder = gruppenavnVeileder;
@@ -66,6 +70,7 @@ public NavAnsattRestTjeneste(
this.gruppenavnKode6 = gruppenavnKode6;
this.gruppenavnKode7 = gruppenavnKode7;
this.skalViseDetaljerteFeilmeldinger = BooleanUtils.toBoolean(viseDetaljerteFeilmeldinger);
+ this.msGraphTjeneste = microsoftGraphTjeneste;
}
@GET
@@ -79,9 +84,15 @@ public NavAnsattRestTjeneste(
public InnloggetAnsattDto innloggetBruker() {
String ident = SubjectHandler.getSubjectHandler().getUid();
- if (!ENV.isProd()) {
- log.info("Kjører i ikke-prod, mocket bruker.");
- return mockInnloggetBrukerDto(ident);
+ if (!ENV.isProd() && !ENV.isLocal()) {
+ try {
+ MSGraphBruker innloggetBruker = msGraphTjeneste.getUserInfoFromGraph(ident);
+ return getInnloggetBrukerDto(ident, innloggetBruker);
+ } catch (Exception e) {
+ // TODO Fjern mocking når vi har på plass riktig tilgang til MS Graph
+ log.error("Feil ved henting av brukerinfo fra MS Graph. Returnerer mocket bruker", e);
+ return mockInnloggetBrukerDto(ident);
+ }
}
// FIXME: Erstatt med Microsoft Graph.
@@ -106,6 +117,23 @@ InnloggetAnsattDto getInnloggetBrukerDto(String ident, LdapBruker ldapBruker) {
.create();
}
+ InnloggetAnsattDto getInnloggetBrukerDto(String ident, MSGraphBruker bruker) {
+ String navn = bruker.bruker().getDisplayName();
+ List groupNames = bruker.grupper().stream().map(Group::getDisplayName).toList();
+ return InnloggetAnsattDto.builder()
+ .setBrukernavn(ident)
+ .setNavn(navn)
+ .setKanSaksbehandle(groupNames.contains(gruppenavnSaksbehandler))
+ .setKanVeilede(groupNames.contains(gruppenavnVeileder))
+ .setKanBeslutte(groupNames.contains(gruppenavnBeslutter))
+ .setKanOverstyre(groupNames.contains(gruppenavnOverstyrer))
+ .setKanBehandleKodeEgenAnsatt(groupNames.contains(gruppenavnEgenAnsatt))
+ .setKanBehandleKode6(groupNames.contains(gruppenavnKode6))
+ .setKanBehandleKode7(groupNames.contains(gruppenavnKode7))
+ .skalViseDetaljerteFeilmeldinger(this.skalViseDetaljerteFeilmeldinger)
+ .create();
+ }
+
InnloggetAnsattDto mockInnloggetBrukerDto(String ident) {
String navn = "Mocket saksbehandler";
return InnloggetAnsattDto.builder()
@@ -121,5 +149,4 @@ InnloggetAnsattDto mockInnloggetBrukerDto(String ident) {
.skalViseDetaljerteFeilmeldinger(this.skalViseDetaljerteFeilmeldinger)
.create();
}
-
}
diff --git a/web/src/test/java/no/nav/ung/sak/web/app/tjenester/saksbehandler/NavAnsattRestTjenesteTest.java b/web/src/test/java/no/nav/ung/sak/web/app/tjenester/saksbehandler/NavAnsattRestTjenesteTest.java
index d70239b0e6..4cb58d1901 100644
--- a/web/src/test/java/no/nav/ung/sak/web/app/tjenester/saksbehandler/NavAnsattRestTjenesteTest.java
+++ b/web/src/test/java/no/nav/ung/sak/web/app/tjenester/saksbehandler/NavAnsattRestTjenesteTest.java
@@ -1,14 +1,17 @@
package no.nav.ung.sak.web.app.tjenester.saksbehandler;
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.List;
-
+import com.microsoft.graph.models.Group;
+import com.microsoft.graph.models.User;
+import no.nav.ung.sak.kontrakt.abac.InnloggetAnsattDto;
+import no.nav.ung.sak.web.app.tjenester.microsoftgraph.MSGraphBruker;
+import no.nav.ung.sak.web.app.tjenester.microsoftgraph.MicrosoftGraphTjeneste;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
-import no.nav.ung.sak.kontrakt.abac.InnloggetAnsattDto;
-import no.nav.k9.felles.integrasjon.ldap.LdapBruker;
+import java.util.Arrays;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
public class NavAnsattRestTjenesteTest {
private static final String gruppenavnSaksbehandler = "Saksbehandler";
@@ -21,15 +24,17 @@ public class NavAnsattRestTjenesteTest {
private static final Boolean skalViseDetaljerteFeilmeldinger = true;
private NavAnsattRestTjeneste saksbehandlerTjeneste;
+ private MicrosoftGraphTjeneste microsoftGraphTjeneste = mock(MicrosoftGraphTjeneste.class);
+
@BeforeEach
public void setUp() {
- saksbehandlerTjeneste = new NavAnsattRestTjeneste(gruppenavnSaksbehandler, gruppenavnVeileder, gruppenavnBeslutter, gruppenavnOverstyrer, gruppenavnEgenAnsatt, gruppenavnKode6, gruppenavnKode7, skalViseDetaljerteFeilmeldinger);
+ saksbehandlerTjeneste = new NavAnsattRestTjeneste(gruppenavnSaksbehandler, gruppenavnVeileder, gruppenavnBeslutter, gruppenavnOverstyrer, gruppenavnEgenAnsatt, gruppenavnKode6, gruppenavnKode7, skalViseDetaljerteFeilmeldinger, microsoftGraphTjeneste);
}
@Test
public void skalMappeSaksbehandlerGruppeTilKanSaksbehandleRettighet() {
- LdapBruker brukerUtenforSaksbehandlerGruppe = getTestBruker();
- LdapBruker brukerISaksbehandlerGruppe = getTestBruker(gruppenavnSaksbehandler);
+ MSGraphBruker brukerUtenforSaksbehandlerGruppe = getTestBruker();
+ MSGraphBruker brukerISaksbehandlerGruppe = getTestBruker(gruppenavnSaksbehandler);
InnloggetAnsattDto innloggetBrukerUtenSaksbehandlerRettighet = saksbehandlerTjeneste.getInnloggetBrukerDto(null, brukerUtenforSaksbehandlerGruppe);
InnloggetAnsattDto innloggetBrukerMedSaksbehandlerRettighet = saksbehandlerTjeneste.getInnloggetBrukerDto(null, brukerISaksbehandlerGruppe);
@@ -40,8 +45,8 @@ public void skalMappeSaksbehandlerGruppeTilKanSaksbehandleRettighet() {
@Test
public void skalMappeVeilederGruppeTilKanVeiledeRettighet() {
- LdapBruker brukerUtenforVeilederGruppe = getTestBruker();
- LdapBruker brukerIVeilederGruppe = getTestBruker(gruppenavnVeileder);
+ MSGraphBruker brukerUtenforVeilederGruppe = getTestBruker();
+ MSGraphBruker brukerIVeilederGruppe = getTestBruker(gruppenavnVeileder);
InnloggetAnsattDto innloggetBrukerUtenVeilederRettighet = saksbehandlerTjeneste.getInnloggetBrukerDto(null, brukerUtenforVeilederGruppe);
InnloggetAnsattDto innloggetBrukerMedVeilederRettighet = saksbehandlerTjeneste.getInnloggetBrukerDto(null, brukerIVeilederGruppe);
@@ -52,8 +57,8 @@ public void skalMappeVeilederGruppeTilKanVeiledeRettighet() {
@Test
public void skalMappeBeslutterGruppeTilKanBeslutteRettighet() {
- LdapBruker brukerUtenforBeslutterGruppe = getTestBruker();
- LdapBruker brukerIBeslutterGruppe = getTestBruker(gruppenavnBeslutter);
+ MSGraphBruker brukerUtenforBeslutterGruppe = getTestBruker();
+ MSGraphBruker brukerIBeslutterGruppe = getTestBruker(gruppenavnBeslutter);
InnloggetAnsattDto innloggetBrukerUtenBeslutterRettighet = saksbehandlerTjeneste.getInnloggetBrukerDto(null, brukerUtenforBeslutterGruppe);
InnloggetAnsattDto innloggetBrukerMedBeslutterRettighet = saksbehandlerTjeneste.getInnloggetBrukerDto(null, brukerIBeslutterGruppe);
@@ -64,8 +69,8 @@ public void skalMappeBeslutterGruppeTilKanBeslutteRettighet() {
@Test
public void skalMappeOverstyrerGruppeTilKanOverstyreRettighet() {
- LdapBruker brukerUtenforOverstyrerGruppe = getTestBruker();
- LdapBruker brukerIOverstyrerGruppe = getTestBruker(gruppenavnOverstyrer);
+ MSGraphBruker brukerUtenforOverstyrerGruppe = getTestBruker();
+ MSGraphBruker brukerIOverstyrerGruppe = getTestBruker(gruppenavnOverstyrer);
InnloggetAnsattDto innloggetBrukerUtenOverstyrerRettighet = saksbehandlerTjeneste.getInnloggetBrukerDto(null, brukerUtenforOverstyrerGruppe);
InnloggetAnsattDto innloggetBrukerMedOverstyrerRettighet = saksbehandlerTjeneste.getInnloggetBrukerDto(null, brukerIOverstyrerGruppe);
@@ -76,8 +81,8 @@ public void skalMappeOverstyrerGruppeTilKanOverstyreRettighet() {
@Test
public void skalMappeEgenAnsattGruppeTilKanBehandleEgenAnsattRettighet() {
- LdapBruker brukerUtenforEgenAnsattGruppe = getTestBruker();
- LdapBruker brukerIEgenAnsattGruppe = getTestBruker(gruppenavnEgenAnsatt);
+ MSGraphBruker brukerUtenforEgenAnsattGruppe = getTestBruker();
+ MSGraphBruker brukerIEgenAnsattGruppe = getTestBruker(gruppenavnEgenAnsatt);
InnloggetAnsattDto innloggetBrukerUtenEgenAnsattRettighet = saksbehandlerTjeneste.getInnloggetBrukerDto(null, brukerUtenforEgenAnsattGruppe);
InnloggetAnsattDto innloggetBrukerMedEgenAnsattRettighet = saksbehandlerTjeneste.getInnloggetBrukerDto(null, brukerIEgenAnsattGruppe);
@@ -88,8 +93,8 @@ public void skalMappeEgenAnsattGruppeTilKanBehandleEgenAnsattRettighet() {
@Test
public void skalMappeKode6GruppeTilKanBehandleKode6Rettighet() {
- LdapBruker brukerUtenforKode6Gruppe = getTestBruker();
- LdapBruker brukerIKode6Gruppe = getTestBruker(gruppenavnKode6);
+ MSGraphBruker brukerUtenforKode6Gruppe = getTestBruker();
+ MSGraphBruker brukerIKode6Gruppe = getTestBruker(gruppenavnKode6);
InnloggetAnsattDto innloggetBrukerUtenKode6Rettighet = saksbehandlerTjeneste.getInnloggetBrukerDto(null, brukerUtenforKode6Gruppe);
InnloggetAnsattDto innloggetBrukerMedKode6Rettighet = saksbehandlerTjeneste.getInnloggetBrukerDto(null, brukerIKode6Gruppe);
@@ -100,8 +105,8 @@ public void skalMappeKode6GruppeTilKanBehandleKode6Rettighet() {
@Test
public void skalMappeKode7GruppeTilKanBehandleKode7Rettighet() {
- LdapBruker brukerUtenforKode7Gruppe = getTestBruker();
- LdapBruker brukerIKode7Gruppe = getTestBruker(gruppenavnKode7);
+ MSGraphBruker brukerUtenforKode7Gruppe = getTestBruker();
+ MSGraphBruker brukerIKode7Gruppe = getTestBruker(gruppenavnKode7);
InnloggetAnsattDto innloggetBrukerUtenKode7Rettighet = saksbehandlerTjeneste.getInnloggetBrukerDto(null, brukerUtenforKode7Gruppe);
InnloggetAnsattDto innloggetBrukerMedKode7Rettighet = saksbehandlerTjeneste.getInnloggetBrukerDto(null, brukerIKode7Gruppe);
@@ -110,7 +115,13 @@ public void skalMappeKode7GruppeTilKanBehandleKode7Rettighet() {
assertThat(innloggetBrukerMedKode7Rettighet.getKanBehandleKode7()).isTrue();
}
- private static LdapBruker getTestBruker(String... grupper) {
- return new LdapBruker("Testbruker", List.of(grupper));
+ private static MSGraphBruker getTestBruker(String... grupper) {
+ User user = new User();
+ user.setDisplayName("Testbruker");
+ return new MSGraphBruker(user, Arrays.stream(grupper).map(g -> {
+ Group group = new Group();
+ group.setDisplayName(g);
+ return group;
+ }).toList());
}
}