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()); } }