Skip to content

Commit

Permalink
Integrerer mot MS Graph for bruker og grupper info.
Browse files Browse the repository at this point in the history
Ved feilende kall mot Graph, returneres det mocket data for å ikke forstyrre testing i Q1.
  • Loading branch information
ramrock93 committed Nov 18, 2024
1 parent 401b238 commit 9bb4f20
Show file tree
Hide file tree
Showing 7 changed files with 183 additions and 42 deletions.
1 change: 1 addition & 0 deletions web/app-vtp.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
12 changes: 12 additions & 0 deletions web/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
<properties>
<swagger-ui.version>5.18.1</swagger-ui.version>
<jetty.version>12.0.15</jetty.version>
<microsoft-graph.version>6.20.0</microsoft-graph.version>
<azure-identity.version>1.14.2</azure-identity.version>
</properties>


Expand Down Expand Up @@ -285,6 +287,16 @@
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.microsoft.graph</groupId>
<artifactId>microsoft-graph</artifactId>
<version>${microsoft-graph.version}</version>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity</artifactId>
<version>${azure-identity.version}</version>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Group> grupper) {
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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<Group> 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();
}
}
Original file line number Diff line number Diff line change
@@ -1,36 +1,41 @@
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;
import jakarta.ws.rs.GET;
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;
Expand All @@ -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
}
Expand All @@ -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;
Expand All @@ -66,6 +70,7 @@ public NavAnsattRestTjeneste(
this.gruppenavnKode6 = gruppenavnKode6;
this.gruppenavnKode7 = gruppenavnKode7;
this.skalViseDetaljerteFeilmeldinger = BooleanUtils.toBoolean(viseDetaljerteFeilmeldinger);
this.msGraphTjeneste = microsoftGraphTjeneste;
}

@GET
Expand All @@ -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.
Expand All @@ -106,6 +117,23 @@ InnloggetAnsattDto getInnloggetBrukerDto(String ident, LdapBruker ldapBruker) {
.create();
}

InnloggetAnsattDto getInnloggetBrukerDto(String ident, MSGraphBruker bruker) {
String navn = bruker.bruker().getDisplayName();
List<String> 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()
Expand All @@ -121,5 +149,4 @@ InnloggetAnsattDto mockInnloggetBrukerDto(String ident) {
.skalViseDetaljerteFeilmeldinger(this.skalViseDetaljerteFeilmeldinger)
.create();
}

}
Original file line number Diff line number Diff line change
@@ -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";
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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());
}
}

0 comments on commit 9bb4f20

Please sign in to comment.