API for tilgangskontroll med regler som er felles for Produktområde Arbeidsoppfølging. Har også en HTTP-klient som kan trekkes inn som en avhengighet i applikasjoner for å kalle API'et.
Det er anbefalt å legge til GitHub Package Registry til slutt for å først søke igjennom andre repositories for avhengigheter.
Maven:
<repositories>
<!-- Legger til central eksplisitt for prioritet over github -->
<repository>
<id>central</id>
<url>https://repo.maven.apache.org/maven2</url>
</repository>
<repository>
<id>github</id>
<url>https://github-package-registry-mirror.gc.nav.no/cached/maven-release</url>
</repository>
</repositories>
Gradle:
repositories {
// Legger til central eksplisitt for prioritet over github
mavenCentral()
maven { url "https://github-package-registry-mirror.gc.nav.no/cached/maven-release" }
}
Hent siste versjon av klienten på https://github.com/navikt/poao-tilgang/releases og legg til avhengigheten.
Maven:
<dependency>
<groupId>no.nav.poao-tilgang</groupId>
<artifactId>client</artifactId>
<version>YYYY.MM.DD_HH.mm-SHA</version>
</dependency>
Gradle:
dependencies {
implementation 'no.nav.poao-tilgang:client:YYYY.MM.DD_HH.mm-SHA'
}
# nais-(dev|prod).yaml
accessPolicy:
inbound:
rules:
- application: <application>
namespace: <namespace>
cluster: <cluster>
val client: PoaoTilgangClient = PoaoTilgangCachedClient(
PoaoTilgangHttpClient(
baseUrl = "http://poao-tilgang.poao.svc.cluster.local", // or use "http://poao-tilgang.poao.svc.nais.local" if your sending the request from dev-fss/prod-fss
tokenProvider = { "machine-to-machine token" }
)
)
val decision = client.evaluatePolicy(NavAnsattTilgangTilEksternBrukerPolicyInput(
navAnsattAzureId = UUID.fromString("some id"), // Dette kan hentes fra "oid"-claimet til en NAV ansatt sitt Azure AD JWT token
tilgangType = TilgangType.LESE,
norskIdent = "01234567890" // fnr, dnr etc
)).getOrThrow()
println("Nav ansatt har lesetilgang til bruker: ${decision.isPermit}")
interface PoaoTilgangClient {
/**
* Evaluer en policy med gitt input, sjekk {@link no.nav.poao_tilgang.client.PolicyInput.kt} for hvilke policies som er tilgjengelig
*/
fun evaluatePolicy(input: PolicyInput): ApiResult<Decision>
/**
* Evaluer flere policies, sjekk {@link no.nav.poao_tilgang.client.PolicyInput.kt} for hvilke policies som er tilgjengelig
*/
fun evaluatePolicies(requests: List<PolicyRequest>): ApiResult<List<PolicyResult>>
/**
* Henter alle Azure AD-grupper til en NAV Ansatt ved bruk av objekt IDen til den ansatte
*/
fun hentAdGrupper(navAnsattAzureId: UUID): ApiResult<List<AdGruppe>>
/**
* Henter om en enkelt person er skjermet. Skjermet person var tidligere kjent som "egen ansatt"
*/
fun erSkjermetPerson(norskIdent: NorskIdent): ApiResult<Boolean>
/**
* Henter om flere personer er skjermet. Skjermet person var tidligere kjent som "egen ansatt"
*/
fun erSkjermetPerson(norskeIdenter: List<NorskIdent>): ApiResult<Map<NorskIdent, Boolean>>
}
/*
Sjekker om en NAV ansatt har lese- eller skrivetilgang til en ekstern bruker.
For funksjoner som gjør endringer på data så ønsker man oftest å benytte sjekk på skrivetilgang,
mens for funksjoner som kun henter data så benyttes oftest lesetilgang.
Veiledere har både lese- og skrivetilgang, mens f.eks NKS har kun lesetilgang.
*/
data class NavAnsattTilgangTilEksternBrukerPolicyInput(
val navAnsattAzureId: UUID,
val tilgangType: TilgangType,
val norskIdent: String
) : PolicyInput()
/*
Sjekker om en NAV ansatt har skrivetilgang til en ekstern bruker.
*/
data class NavAnsattNavIdentSkrivetilgangTilEksternBrukerPolicyInput(
val navIdent: String,
val norskIdent: String
) : PolicyInput()
/*
Sjekker om en NAV ansatt har lese til en ekstern bruker.
*/
data class NavAnsattNavIdentLesetilgangTilEksternBrukerPolicyInput(
val navIdent: String,
val norskIdent: String
) : PolicyInput()
/*
Sjekker om en NAV ansatt har tilgang til å bruke Modia-flaten
*/
data class NavAnsattTilgangTilModiaPolicyInput(
val navAnsattAzureId: UUID
) : PolicyInput()
/*
Sjekker om en NAV ansatt har tilgang til spesifik NAVenhet
*/
data class NavAnsattTilgangTilNavEnhetPolicyInput(
val navAnsattAzureId: UUID,
val navEnhetId: String
) : PolicyInput()
/*
Sjekker om en NAV ansatt kan behandle **strengt** fortrolig brukere (kode 6)
*/
data class NavAnsattBehandleStrengtFortroligBrukerePolicyInput(
val navAnsattAzureId: UUID
) : PolicyInput()
/*
Sjekker om en NAV ansatt kan behandle **strengt** fortrolig brukere (kode 6).
Tar nav ident som input
*/
data class NavAnsattNavIdentBehandleStrengtFortroligBrukerePolicyInput(
val navIdent: String,
) : PolicyInput()
/*
Sjekker om en NAV ansatt kan behandle fortrolig brukere (kode 7)
*/
data class NavAnsattBehandleFortroligBrukerePolicyInput(
val navAnsattAzureId: UUID
) : PolicyInput()
/*
Sjekker om en NAV ansatt kan behandle fortrolig brukere (kode 7)
Tar navident som input
*/
data class NavAnsattNavIdentBehandleFortroligBrukerePolicyInput(
val navIdent: String,
) : PolicyInput()
/*
Sjekker om en NAV ansatt kan behandle skjermede personer (egne ansatte)
*/
data class NavAnsattBehandleSkjermedePersonerPolicyInput(
val navAnsattAzureId: UUID
) : PolicyInput()
/*
Sjekker om en NAV ansatt kan behandle skjermede personer (egne ansatte).
Tar navident som input
*/
data class NavAnsattNavIdentBehandleSkjermedePersonerPolicyInput(
val navIdent: String,
) : PolicyInput()
/*
Sjekker om en NAV ansatt har tilgang til NAV enhet med sperre. Brukes i forbindelse med KVP.
*/
data class NavAnsattTilgangTilNavEnhetMedSperrePolicyInput(
val navAnsattAzureId: UUID,
val navEnhetId: String
) : PolicyInput()
/*
Sjekker om Nav ansatt har Modia Admin rolle
*/
data class NavAnsattTilgangTilModiaAdminPolicyInput(
val navAnsattAzureId: UUID
) : PolicyInput()
/*
Sjekker om en ekstern bruker har tilgang til en annen ekstern bruker.
Foreløpig sjekker denne kun om identene er like. Implementasjonen har ikke støtte for å sjekke historiske fnr mot gjeldende fnr.
Den har heller ikke støtte for representasjon av en bruker.
*/
data class EksternBrukerTilgangTilEksternBrukerPolicyInput(
val rekvirentNorskIdent: String, // Den som ber om tilgang
val ressursNorskIdent: String // Den som bes tilgang om
) : PolicyInput()
/*
Sjekker om en Nav-ansatt har tilgang til en enhet
*/
data class NavAnsattNavIdentTilgangTilNavEnhetPolicyInput(
val navIdent: String,
val navEnhetId: String
) : PolicyInput()
For å legge tilrette for enkel testing av poao-tilgang så er det laget en mockClient og wiremock oppsett.
Disse ligger i modulene poao-tilgang-test-wiremock
og poao-tilgang-test-mockClient
.
Eksempel på bruk finnes i testene.
Poao-tilgang er delt opp i flere moduler for å gjøre det enklere å vedlikeholde en tydelig arkitektur.
Modulene er som følger:
- api - felles DTOer som brukes av client-modulen og application-modulen
- application - kjører opp applikasjonen, definerer endepunkter, etc. Tar i bruk core-modulen for å eksponere tilgangskontrollregler med et REST API
- client - brukes ikke direkte av poao-tilgang, men av andre konsumerende applikasjoner som ønsker en ferdig testet klient for å gjøre requests mot poao-tilgang
- core - inneholder implementasjon og definisjon av alle de ulike tilgangskontrollreglene til poao-tilgang
Poao-tilgang sin azure app-registrering har spesielle privilegier i form av API permissions mot Microsoft Graph. Dersom det er behov for å endre disse så må det gjøres i Azure portalen.
API/Permission name | Beskrivelse |
---|---|
GroupMember.Read.All | Les medlemskap i alle grupper |
Group.Read.All | Les grupper |
openid | Sign in and read user profile |
User.Read | Les brukerprofiler |
User.Read.All | Les brukerprofiler i organisasjonen |