Gå til hovedinnhold

Tilgangsstyring for utviklere

Dette må du få med deg

Alle views i configuration.xml skal ha et access-element som definerer tilgangsstyring. Du får ikke installere kjerneapi-skjemaet dersom et view mangler access; mvn install vil feile.

Ved installering blir det opprettet sikkerhets-retningslinjer for alle views og tabeller. Brukere som aksesserer et kjerneapi-view må eksplisitt gis tilgang. Er brukeren din ikke nevnt i en tilgangsliste, får den ikke tilgang.

Brukere

users-elementet i konfigurasjonen forteller hvilke brukere som skal opprettes i RAS. Her begrenser vi oss enn så lenge til én bruker for applikasjonsformål og én for integrasjonsformål. Sistnevnte tilgangskontrollerer vi basert på rollene som maskinbrukerenen har fått tildelt i FSWS_AUTH. Førstnevnte krever i tillegg at vi kjenner til sluttbruker, og at hen har nødvendig tilgang i FS.

<users>
<user>APPLIKASJONSBRUKER</user>
<user>MASKINBRUKER</user>
</users>

Ved installasjon av KJERNEAPI-skjemaet blir brukerne i users-elementet opprettet.

Merk at disse brukerne ikke er vanlige databasebrukere, men RAS-brukere. Oracle kaller de for applikasjonsbrukere i sin dokumentasjon

Hvilken bruker blir brukt?

Forespørsler som inneholder fødselsnummer (fra Feide eller sudo-header) bruker applikasjonsbruker. Andre forespørsler håndteres med maskinbruker.

Roller

roles-elementet forteller hvilke roller som finnes:

<roles>
<role enabledByDefault="true">
<name>STUDIEELEMENTER_LES1</name>
<principals>
<principal>APPLIKASJONSBRUKER</principal>
<principal>MASKINBRUKER</principal>
</principals>
</role>
...
</roles>

Her er name navnet på rolla og principals listen med brukere og roller som skal ha den.

enabledByDefault angir hvorvidt rolla blir aktivert automatisk ved oppretting av ny database-sesjon for brukeren. Dette må brukes med varsomhet. For eksempel er det mange ulike brukere, med ulike tilgangsnivåer som skal ha MASKINBRUKER-tilgang. Det betyr at flere roller ikke skal aktiveres automatisk. I stedet blir roller aktivert for brukeren dersom hen har den oppført i FSWS_AUTH.RASBRUKER_INSTITUSJON_ROLLE-tabellen.

En spesiell kontrolliste

Det finnes en spesiell tilgangskontrolliste, BYPASS_RAS_ACL. Denne blir gitt til databaserollen FS_WSROLE, for at den skal få omgå restriksjonene i tilgangsstyringen.

Domener (realms)

Alle tilgjengelige domener er definert i starten av configuration.xml.

Disse har et predikat som blir sjekket for å avgjøre om en view-rad (tabell-rad) tilhører skrankens domene. Predikatet 1=1 er sant for alle rader. Andre predikat gjør for eksempel en sjekk på databasesesjonens PLNR-attributt i forhold til viewets PLNR-kolonne.

Her er noen eksempeler sakset fra dagens konfigurasjon:

<realmPredicates>
<realmPredicate>
<name>ALLE_RADER</name>
<predicate><![CDATA[1=1]]></predicate>
</realmPredicate>
<realmPredicate>
<name>SAKSBEHANDLER_STUDENT_FORBINDELSE</name>
<predicate>
<![CDATA[''J'' = Pk_Ras_Tilgang.F_Saksbehandler_Student_Forbindelse('
||'Xs_Sys_Context(''KJERNEAPINS'',''PLNR''),'
||'Plnr)]]>
</predicate>
</realmPredicate>
...

Hvordan kan jeg teste tilgangskontrollen?

Du kan enkelt teste tilgangskontroll ved å sette sudo-headere. Merk at dette bare fungerer mot miljø som kun inneholder syntetiske data. Dette vil dermed fungere for lokal utvikling og mot test-miljøet, men ikke demo og prod.

Vi støtter to forskjellige sudo-headere:

  • Sudo-Fodselsnr lar deg overstyre fødselsnummeret som forespørselen tilgangstyres etter.
  • Sudo-Roller lar deg overstyre hvilke tilgangsroller forespørselen skal tilgangsstyres etter.

Verdien til Sudo-Roller er en kommaseparert liste med roller. For eksempel "lanekassen_rolle,studinfoskriv".

Merk at for applikasjonsbrukere så utføres tilgangskontroll både for fødselsnummer og institusjonsroller så må oppgitt bruker ha nødvendige tilganger

Sudo-headere med GraphiQL

Settes ved å legge inn en json-verdi i Headers-fanen nederst i GraphiQL. For eksempel:

{
"Sudo-Fodselsnr": "01514490283"
}

Sudo-headere med curl

Følgende fungerer med curl:

$ curl -u admin:admin \
-H Content-Type:application/json \
-H Sudo-Fodselsnr:01514490283 \
-H Sudo-Roller:student \
-d '{"query":"query { studenter(filter: { eierInstitusjonsnummer: \"1234\" }, first: 2)
{ nodes { studentnummer }}}" }' \
http://localhost:8080/graphql

$ curl -u admin:admin \
-H Content-Type:application/json \
-H Sudo-Fodselsnr:12587590814 \
-H Sudo-Roller:saksbehandler \
-d '{"query":"query { studenter(filter: { eierInstitusjonsnummer: \"1234\" }, first: 2)
{ nodes { studentnummer }}}" }' \
http://localhost:8080/graphql

$ curl -u admin:admin \
-H Content-Type:application/json \
-H Sudo-Roller:studieelementer_les2 \
-d '{"query":"query { fagpersoner(filter: { eierInstitusjonsnummer: \"1234\" },
first: 2)
{ nodes { fornavn }}}" }' \
http://localhost:8080/graphql

Integrasjonstester

I tillegg til manuell testing så har vi enhetstester i kjerneapi-service. Let etter fila TilgangsTest.java. Her blir det gjort direkte sql som tester funksjonaliteten.

Videre finnes det integrasjonstester i fsapi-rest som bruker sudo-headere.

Direkte testing med databasebruker

Du kan også logge deg direkte på databasen som bruker ras_session_mgr (passord "FS_TEST") i imaget. Denne brukeren kan opprette sesjoner for ras-brukertyper. Du finner nødvendige invokasjoner i ConnectionManager.java:setupRasSession.

Slik kan du f.eks. starte en sesjon som maskinbruker med rollen studentdata_les1:

DECLARE
session_id VARCHAR2(32);
BEGIN
kjerneapi.pk_ras.create_and_attach(
p_Institusjonsnr => '1234',
p_Applikasjonnavn => NULL,
p_Applikasjonsroller => kjerneapi.pk_ras.t_rolleliste('studentdata_les1'),
p_Fodselsnr => NULL,
p_SudoFodselsnr => NULL,
p_SessionId => session_id
);

DBMS_OUTPUT.PUT_LINE('Session ID: ' || session_id);
END;

Referanse til Oracles dokumentasjon

For mer informasjon om tilgangsstyringen, se Oracles RAS-dokumentasjon

Beslutningslogg for tilganger

Team Studieplanlegging føler et behov for å tracke diskusjoner/avgjørelser rundt tilgangskontroll. Vi håper dette dokumentet kan komme godt med.

BesluttetDokumentBeslutning
2024-01-10Gradvis innføring av RASVi ønsker en gradvis overgang til bruk av RAS
2024-01-10Minimumstilgang for api-brukereVi ønsker at brukere av api-et får en minimums-tilgang
2024-01-29Tilgang til fagpersoner og rollerTilgang til Fagpersoner (uten tilgang til Personer)
2024-02-15Tilgang til grunnleggende studentdataTilgang til grunnleggende data for studenter
2024-02-29Tilgang til studenters protokollerTilgang til studenters protokoller i forbindelse med resultatutveksling
2024-04-12Tilgang til studenters bankkontonummerTilgang til bankkontonummer krever en egen rolle
2024-04-15Tilgang til flere studentdataTilgang til data for grunnleggende studieadministrative prosesser
2024-04-15Tilgang til studenthendelserTilgang til studenthendelser
2024-04-30Lese- og skrivetilgang til studentbilderTilgang til studentbilder
2024-05-10Nye roller for tilgang til fagpersondata og personrollerVi endrer på rollesettet for tilgang til fagpersondata og personroller
2024-05-10Tilgang til utvekslingsopphold i GeminiMidlertidig rolle for tilgang til utvekslingsopphold i Gemini (gammel modell)
2024-05-10Tilgang til persondataTilgangsroller for klienter som skal behandle data om alle personer
2024-05-10Tilgang til studieelementerSTUDIEELEMENTER_LES2 skal gi tilgang til grunnlagsdata som ikke alle brukere skal ha tilgang til
2024-05-10Tilgang for godkjenning av ekstern utdanning
2024-06-12Tilganger for utvekslingsstudenterVi oppretter tilgangsroller for henholdsvis innreisende og utreisende utvekslingsstudenter
2025-03-20Tilgang til data om EVU-kursdeltakere
2025-03-26Tilgang til emnesøknader
2025-03-27Tilgang til undervisningsdata
2025-03-28Tilgang til data om EVU-kurssøknaderEVU_OPPTAK_LES1 gir tilgang til EVU-kurssøknader. EVU_OPPTAK_HENDELSER_LES1 gir tilgang til EUV-kurssøknadshendelser.
2025-03-28Tilgang til personprofilhendelser
2025-03-28Tilgang til personrollehendelserPERSONROLLE_HENDELSER_LES1 gir tilgang til alle personrollehendelser
2026-02-16Tilgang til studenters fødselsnummerSTUDENTDATA_LES2 gir tilgang til fødselsnummer for studenter