Forvalte tilgangsroller og rolleimplikasjoner
Her beskriver vi hvordan du leser og forvalter rollekatalogen i tilgangsstyringen gjennom FS GraphQL API: opprette og endre tilgangsroller, flytte dem mellom navnerom, og legge til og fjerne rolleimplikasjoner.
Forvaltningen av rollekatalogen er på eksperimentell kontrakt, og endringer kan forekomme uten varsel.
Du må sette headeren Feature-Flags: beta,experimental, se
Tidlig tilgang til funksjonalitet under utvikling.
Alle navnerom eies foreløpig av Sikt, og privilegiene under er ikke tildelt andre. Lesingen av katalogen er åpen, men endringer i rollekatalogen gjøres foreløpig bare av Sikt.
Roller, navnerom og rolleimplikasjoner
En tilgangsrolle er en kode, for eksempel utdanning_les, som kan tildeles brukere og applikasjoner.
Rolletypen sier om koden er en enkelttilgang (TILGANG) eller en sammensatt rolle (ROLLE); den styrer hvordan
koden vises, ikke hva den gir.
Hver rolle forvaltes i nøyaktig ett navnerom. Navnerommet har en eierorganisasjon, og det er den som avgjør hvem
som kan endre rollene der. Navneromstypen (subgraf, frontend, forretning, tilgangsstyring) avgjør om
rollekoden følger med i tokenet ut til subgrafene: bare roller i navnerom av typen subgraf gjør det.
En rolleimplikasjon fra A til B betyr at den som har A, også har B. Implikasjonene danner en graf på tvers av navnerom, typisk fra en forretningsrolle via frontendroller ned til rollene subgrafene leser.
Hvem kan gjøre hva
Retten til å forvalte rollekatalogen følger eierorganisasjonen til navnerommet, ikke rollen. Det finnes to privilegier:
| Privilegium | Gir |
|---|---|
BRUKERADMIN_ROLLE_SKRIV | Opprette roller, flytte roller mellom navnerom, legge til og fjerne rolleimplikasjoner, og alt det smale privilegiet gir |
BRUKERADMIN_ROLLEBESKRIVELSE_SKRIV | Endre beskrivelse og rolletype på roller |
| Operasjon | Krever |
|---|---|
| Lese katalogen | Ingen av privilegiene – katalogen kan leses av alle med tilgang til API-et |
opprettTilgangsroller | BRUKERADMIN_ROLLE_SKRIV i eierorganisasjonen til navnerommet rollen legges i |
oppdaterTilgangsroller | BRUKERADMIN_ROLLEBESKRIVELSE_SKRIV eller BRUKERADMIN_ROLLE_SKRIV i eierorganisasjonen til rollens navnerom |
flyttTilgangsrollerTilNavnerom | BRUKERADMIN_ROLLE_SKRIV i eierorganisasjonen til både det gamle og det nye navnerommet |
leggTilRolleimplikasjoner, fjernRolleimplikasjoner | BRUKERADMIN_ROLLE_SKRIV i eierorganisasjonen til navnerommet til rollen implikasjonen går ut fra |
Rollekatalogen er felles for alle miljøer. Derfor må privilegiet være tildelt i miljøet production, og mutasjonene
tas bare imot i produksjonsmiljøet. En endring der gjelder i alle miljøer. Tildelinger av roller er derimot per miljø
og organisasjon.
Lese katalogen
navnerom lister navnerommene, med type og eierorganisasjon. tilgangsroller lister rollene, sortert på kode, og kan
filtreres på ett eller flere navnerom. children og parents på en rolle gir implikasjonene ett nivå ned og opp.
alleImpliserteRoller gir alt en rolle gir: hele kjeden nedover, rollen selv inkludert. heleRollekjeden gir i
tillegg alle rollene som gir den, og egner seg til å se hvem som blir berørt før du endrer en rolle eller
implikasjonene dens. Begge går på tvers av navnerom og tar bare med implikasjoner som gjelder nå.
query Rollekatalog($navnerom: [ID!], $rolle: ID!) {
navnerom {
edges {
node {
id
kode
navneromstype
eier { id }
}
}
}
tilgangsroller(filter: { navnerom: $navnerom }) {
pageInfo { hasNextPage endCursor }
edges {
node {
id
kode
beskrivelse
rolletype
navnerom { kode }
children { kode }
parents { kode }
}
}
}
alleImpliserteRoller(rolle: $rolle) {
edges { node { kode } }
}
}
Variabler:
{
"navnerom": ["<ID for navnerommet fra navnerom>"],
"rolle": "<ID for rollen fra tilgangsroller>"
}
Alle IDer er node-IDer. Hent dem fra navnerom og tilgangsroller; en rollekode alene kan ikke brukes som ID.
Opprette, endre og flytte roller
Alle mutasjonene tar en liste og er alt-eller-ingenting: feiler ett element, skrives ingen av dem. Feil kommer som
typede feil i errors i payloaden, og da er tilgangsroller tom.
Opprette
Rollekoden er rollens identitet. Den er global på tvers av navnerom, kan ikke endres og gjenbrukes aldri. Å opprette
en kode som finnes fra før, gir TilgangsrolleFinnesAllerede – også når resten av forespørselen er lik.
En ny rolle gir ingen tilgang før den tildeles eller blir implisert av en annen rolle.
mutation OpprettRoller($input: [OpprettTilgangsrollerInput!]!) {
opprettTilgangsroller(input: $input) {
tilgangsroller {
id
kode
rolletype
navnerom { kode }
}
errors {
__typename
... on Error { message }
}
}
}
{
"input": [
{
"kode": "EKSEMPEL_LES",
"navneromId": "<ID for navnerommet>",
"rolletype": "TILGANG",
"beskrivelse": "Lesetilgang til eksempeldata"
}
]
}
Svar når du mangler privilegiet i eierorganisasjonen til navnerommet:
{
"data": {
"opprettTilgangsroller": {
"tilgangsroller": [],
"errors": [
{
"__typename": "ManglerRollekatalogforvaltning",
"message": "Du har ikke rettighet til å forvalte rollekatalogen i dette navnerommet."
}
]
}
}
}
| Feil | Når |
|---|---|
ManglerRollekatalogforvaltning | Du mangler privilegiet, eller navnerommet finnes ikke |
TilgangsrolleFinnesAllerede | Rollekoden er i bruk |
RollekatalogReferanseFinnesIkke | En ID er ikke en gyldig node-ID av riktig type |
Endre beskrivelse og rolletype
oppdaterTilgangsroller endrer bare feltene du tar med. Beskrivelsen settes med { verdi: "..." } og tømmes med
{ fjern: true }. Å skrive de samme verdiene på nytt er suksess.
mutation OppdaterRoller($input: [OppdaterTilgangsrollerInput!]!) {
oppdaterTilgangsroller(input: $input) {
tilgangsroller { id kode beskrivelse rolletype }
errors {
__typename
... on Error { message }
}
}
}
{
"input": [
{
"rolleId": "<ID for EKSEMPEL_LES>",
"beskrivelse": { "verdi": "Lesetilgang til eksempeldata i alle organisasjoner" }
}
]
}
Feil: ManglerRollekatalogforvaltning (også når rollen ikke finnes) og RollekatalogReferanseFinnesIkke.
Flytte til et annet navnerom
flyttTilgangsrollerTilNavnerom flytter roller til et annet navnerom. Flyttingen endrer hvem som forvalter rollen,
og – for navnerom av typen subgraf – om rollekoden følger med i tokenet. Den endrer ikke hva rollen gir, og ingen
tildelinger endres.
mutation FlyttRoller($input: [FlyttTilgangsrollerTilNavneromInput!]!) {
flyttTilgangsrollerTilNavnerom(input: $input) {
tilgangsroller { kode navnerom { kode } }
errors {
__typename
... on Error { message }
}
}
}
{
"input": [
{ "rolleId": "<ID for EKSEMPEL_LES>", "navneromId": "<ID for det nye navnerommet>" }
]
}
Å flytte en rolle til navnerommet den allerede ligger i, er suksess, men krever fortsatt privilegiet.
Feil: ManglerRollekatalogforvaltning og RollekatalogReferanseFinnesIkke.
Legge til og fjerne rolleimplikasjoner
En implikasjon fra A til B virker overalt A virker: i tildelinger, i delegeringstak, i gulv og i åpne roller som
nevner A. En nekt på B tar også A. Sjekk derfor heleRollekjeden for A før du endrer implikasjonene.
Reglene:
- Rett på A-siden. Du trenger
BRUKERADMIN_ROLLE_SKRIVi eierorganisasjonen til navnerommet til A. B kan ligge i et hvilket som helst navnerom, og forvalteren av B blir ikke spurt. Den som legger til implikasjonen, aksepterer at B kan endres av andre. - Ingen sykler. En implikasjon som ville gitt en syklus, avvises, og en rolle kan ikke implisere seg selv.
- Utgåtte roller får ingen nye implikasjoner, verken ut eller inn. Implikasjoner de har fra før, gjelder videre og
kan fjernes.
utgattTidspunktpå rollen viser om den er utgått. - Idempotent. En implikasjon som allerede gjelder, er suksess uten skriving. Å fjerne en implikasjon som ikke gjelder, er også suksess. Privilegiet kreves i begge tilfeller.
- Planlagte implikasjoner gir feil, ikke suksess. Å legge til gir
RolleimplikasjonErPlanlagtnår det finnes en implikasjon mellom A og B som ikke har begynt å gjelde, eller som har en sluttdato. Å fjerne gir samme feil når implikasjonen ikke har begynt å gjelde; en som gjelder og har sluttdato, avsluttes som vanlig. - Fjerning er avslutning. Implikasjonen slettes ikke, men avsluttes og blir stående i historikken.
Implikasjonene gjelder i alle miljøer, siden rollekatalogen er felles.
Legge til
mutation LeggTilImplikasjoner($input: [LeggTilRolleimplikasjonerInput!]!) {
leggTilRolleimplikasjoner(input: $input) {
tilgangsroller {
kode
children { kode }
}
errors {
__typename
... on Error { message }
}
}
}
{
"input": [
{
"rolleId": "<ID for EKSEMPEL_SAKSBEHANDLER>",
"implisertRolleId": "<ID for BRUKERADMIN_ER_SAKSBEHANDLER>"
}
]
}
Payloaden inneholder rollene implikasjonene går ut fra, én gang hver. Les children for å se grafen slik den er etter
endringen.
Svar når B allerede gir A, direkte eller via andre roller:
{
"data": {
"leggTilRolleimplikasjoner": {
"tilgangsroller": [],
"errors": [
{
"__typename": "RolleimplikasjonDannerSyklus",
"message": "Implikasjonen ville gitt en syklus i rollegrafen."
}
]
}
}
}
| Feil | Når |
|---|---|
ManglerRollekatalogforvaltning | Du mangler privilegiet for A, eller A finnes ikke |
RollekatalogReferanseFinnesIkke | B finnes ikke, eller en ID er ikke en gyldig node-ID av riktig type |
RolleimplikasjonDannerSyklus | Implikasjonen ville gitt en syklus, eller A og B er samme rolle |
TilgangsrolleErUtgatt | A eller B er utgått |
RolleimplikasjonErPlanlagt | Det finnes en implikasjon mellom A og B som ikke har begynt å gjelde (og, ved å legge til, en med sluttdato) |
Fjerne
mutation FjernImplikasjoner($input: [FjernRolleimplikasjonerInput!]!) {
fjernRolleimplikasjoner(input: $input) {
tilgangsroller {
kode
children { kode }
}
errors {
__typename
... on Error { message }
}
}
}
{
"input": [
{
"rolleId": "<ID for EKSEMPEL_SAKSBEHANDLER>",
"implisertRolleId": "<ID for BRUKERADMIN_ER_SAKSBEHANDLER>"
}
]
}
Den som har A, mister det implikasjonen ga, med mindre noe annet fortsatt gir det.
Feil: ManglerRollekatalogforvaltning (også når A ikke finnes) og RollekatalogReferanseFinnesIkke.