Datatilgang¶
Datatilgang styrer hvilke rader en bruker ser innenfor en modul. Mens Brukere og Brukergrupper bestemmer om en modul i det hele tatt vises i menyen, er datatilgang det som bestemmer om brukeren ser sine egne data, avdelingens data, eller alt.
Regler defineres som en matrise: brukernivå × ObjectType → scope og CRUD-flagg. Komponenten har fire faner: Rolletilgang, Avdelingstilgang, Regnskapstilgang og Forhåndsvisning (data-access-admin.component.html:7-291).
Eksempel: Brukerleveldet "Ansatt" har scope "Egne" for ObjectType
WorkOrder— ansatte ser kun arbeidsordrer de selv er knyttet til. Brukerleveldet "Avdelingsleder" har scope "Avdeling" forHMS.Deviations— ledere ser hele avdelingens avvik.Viktig: Datatilgang erstatter ikke modul-tilgang. Brukeren må ha tilgang til modulen først, deretter bestemmer datatilgang hvilke rader som returneres.
Tilgang¶
| Hvem | Hva trengs |
|---|---|
| Rolle | Administrator (ruten er beskyttet av ActivateService + ModuleGuard) |
| Modul | Portalinnstillinger, moduleId: 99 (setting-routing.module.ts:36) |
| URL | /settings/portal-setting/data-access |
| Effekt | Alle brukere i det angitte brukernivået, på tvers av alle data i den valgte ObjectType |
Datatilgang er en av de mest kritiske innstillingene i ePortal. Feilkonfigurasjon kan lekke data (for vidt scope) eller låse brukere ute (for snevert scope).
Fane 1 — Rolletilgang¶
Setter regler per brukernivå × ObjectType. Velg et brukernivå øverst, så vises en matrise av ObjectTypes gruppert per modul (data-access-admin.component.ts:27-38).
Gruppene som faktisk vises¶
| Gruppe | ObjectTypes |
|---|---|
| CRM | CrmCustomer, CrmContact, CrmMeeting, CrmMeetingTemplate, CrmActivity, CrmDeal, CrmAgreement, CrmOffer, CrmActorRelation — CrmCustomer styrer kundelisten/kundekortet/eksporten (Egne = registrert av brukeren eller brukeren er selger/ansvarlig), CrmContact styrer kontaktpersonene (Egne = opprettet av, delt med, eller knyttet til brukerens kunder) |
| Prosjekt | Project |
| Arbeidsordre | WorkOrder |
| Godkjenning timer | Approval.TimerAktivering |
| Time KPI | Time.Kpi.ViewTeam, Time.Kpi.ManageTargets |
| Rapporter | AbsenceReport |
| Anleggsregister | Anleggsregister.KartverketSync |
| Håndbøker | Handbook.Handbooks, Handbook.ReadStatus |
| HMS | HMS.Templates, HMS.Executions, HMS.Deviations, HMS.SafetyRounds, HMS.Report, HMS.ActionPlan, HMS.RiskAssessment, HMS.Goals, HMS.InternalControl, HMS.ChemicalRegistry, HMS.Actions |
| KAI AI-assistent | KAI.Time, KAI.Approval, KAI.Project, KAI.Crm, KAI.Admin, KAI.Handbook, KAI.BugReport, KAI.Checklist, KAI.Accounting, KAI.HMS, KAI.TimeAction, KAI.WorkflowBuilder |
| Annet | SharePoint.Connection, SuggestionBox |
| Abonnement | Subscription.MasterOrder, Subscription.OrderProposal, Subscription.DateChangeTrace, Subscription.MasterOrderImport, Subscription.ServiceObject, Subscription.LetterRecipient, Subscription.LetterTemplate, Subscription.Configuration, Subscription.TemplateProduct, Subscription.RuleAdmin, Subscription.ScheduleApply, Subscription.GoLiveSwitch — Subscription.RuleAdmin, Subscription.ScheduleApply og Subscription.GoLiveSwitch er fail-closed, se Fail-closed-typer under |
| Support | Freshdesk.Tickets — fail-closed, se Fail-closed-typer under |
| Konti Connect | KontiConnect.VoucherImport |
Listen er statisk i front-end. Nye ObjectTypes blir først konfigurerbare når Konti utvider objectTypeGroups.
Felt i regel-dialogen¶
Når du klikker + (ny regel) eller blyant (rediger) åpnes en modal med formet accessForm (data-access-admin.component.ts:119-125):
| Felt | Type | Standard | Validering |
|---|---|---|---|
accessScope |
Nedtrekk: Egne / Avdeling / Valgte avdelinger / Alle | Own |
Påkrevd (Validators.required) |
canView |
Avkrysning | true |
— |
canCreate |
Avkrysning | true |
— |
canEdit |
Avkrysning | true |
— |
canDelete |
Avkrysning | true |
— |
ObjectType vises som lesbar tekst — den er bundet til raden du klikket og kan ikke endres i dialogen.
Scope-verdier¶
Scope kommer fra accessScopes i komponenten (data-access-admin.component.ts:58-63). Det finnes fire scope — ingen "Custom".
| Verdi | Vist navn | Betydning |
|---|---|---|
Own |
Egne | Kun brukerens egne rader. Default fallback når regel mangler. |
Department |
Avdeling | Brukerens egen avdeling (wv_User.userDepNo) pluss eventuelle avdelinger fra wv_UserDepartmentAccess (DataAccessRepository.cs:605-627). |
SelectedDepartments |
Valgte avdelinger | Samme oppløsning som Department, men ment brukt sammen med eksplisitte oppføringer i Avdelingstilgang-fanen for å gi en bruker tilgang utover egen avdeling. |
All |
Alle | Alle rader i tenanten, ingen filtrering på avdeling. |
Hvis Department eller SelectedDepartments ender med 0 avdelinger (bruker mangler userDepNo og ingen rader i wv_UserDepartmentAccess), logges en advarsel og tilgangen degraderes effektivt til Own (DataAccessRepository.cs:629-636).
CRM-avtaler¶
CrmAgreement styrer avtaleliste, avtaledetaljer, avtale-dashboard, historikk,
varslingsmottakere og widgeten Avtalevarsler.
| Scope | Avtaler som vises |
|---|---|
Own |
Avtaler brukeren har opprettet, er ansvarlig for, er varslingsmottaker på eller har fått eksplisitt delt |
Department / SelectedDepartments |
Alt fra Own, pluss avtaler knyttet til en tilgjengelig avdeling eller med ansvarlig bruker i en tilgjengelig avdeling |
All |
Alle avtaler i tenanten |
CRUD-flaggene styrer hvilke handlinger som er tilgjengelige:
CanViewkreves for avtalesider, dashboard og widget.CanCreateviser Ny avtale og tillater opprettelse.CanEdittillater redigering, tagger og endring av varslingsmottakere.CanDeletetillater sletting.
Bakgrunnsjobben som sender utløpsvarsler behandler fortsatt alle relevante avtaler. Datatilgang begrenser brukerinnsyn, ikke systemets varslingskø.
Fail-closed-typer¶
ObjectTypes med prefiks KAI. eller Freshdesk. (familie-prefiks), samt de eksakte typene Subscription.RuleAdmin, Subscription.ScheduleApply og Subscription.GoLiveSwitch, er fail-closed. To lister i DataAccessRepository styrer dette: FailClosedPrefixes = { "KAI.", "Freshdesk." } (DataAccessRepository.cs:26) og FailClosedExactObjectTypes = { "Subscription.RuleAdmin", "Subscription.ScheduleApply", "Subscription.GoLiveSwitch" } (DataAccessRepository.cs:34), kombinert i IsFailClosedObjectType (DataAccessRepository.cs:41-44). At Subscription.RuleAdmin er en eksakt oppføring (ikke et prefiks) betyr at en søsken-type som Subscription.RuleAdminFoo bevisst ikke er fail-closed — den er en egen, separat styrt ObjectType. Hvis det ikke finnes en regel for brukernivået, settes CanView = false automatisk i ResolveAccess (DataAccessRepository.cs:592-598). Andre ObjectTypes faller tilbake til CanView = true av legacy-hensyn.
Det samme skillet gjelder når selve tabellen wv_DataAccess ikke finnes — for eksempel på en tenant
der tilgangsmigrasjonen ennå ikke har kjørt. Vanlige ObjectTypes får da full tilgang, slik at en
tenant ikke låses ute mens den settes opp, mens fail-closed typer nektes
(DataAccessRepository.cs:544-564).
Fram til august 2026 ga en manglende tabell full tilgang også til fail-closed typene.
Freshdesk.Tickets (Supportsaker-modulen) seedes i tillegg eksplisitt med CanView = 0 for alle brukernivåer ved migrasjon — dette er admin-UX/bootstrap slik at regelen er synlig og konfigurerbar i denne fanen fra dag én, men selve sikkerhetsgrensen er fail-closed-defaulten over: en manglende rad nekter uansett tilgang, en seedet rad med CanView = 0 gjør det samme eksplisitt.
Subscription.GoLiveSwitch styrer skriving mot kundens produksjonsmiljø
Denne rettigheten styrer brytere som starter skriving mot kundens produksjonsmiljø i Visma
Business NXT — i dag overføring av aksepterte tilbud til salgsordre. Den ble skilt ut fordi
Subscription.Configuration er seedet med redigeringstilgang for hvert eneste brukernivå, og
dermed ikke kan brukes til å styre en slik bryter separat: at menypunktet er skjult stopper ikke
et API-kall.
Fra 2026-08-16 er rettigheten seedet med redigeringstilgang for alle brukernivåer
(Migration_20261016900118). Eier vurderte at en salgsordre som når Visma for tidlig er
reversibelt bryderi og ikke skade, og at et krav om å dele ut rettigheten manuelt på hver kunde
dermed var friksjon i utrullingen framfor beskyttelse. Tidligere versjoner av denne siden beskrev
rettigheten som noe ingen hadde som standard — det stemmer ikke lenger.
Rettigheten er fortsatt et reelt håndtak: du kan trekke den fra et brukernivå uten å ta bort hele
pipeline-konfigurasjonssiden. Den er også fortsatt fail-closed når raden eller hele
wv_DataAccess-tabellen mangler. Det som står mellom en administrator og en produksjonsskriving
er nå bekreftelsesdialogen som navngir kunde og NXT-selskap, sammenlikningen mot forventet verdi,
og at nøkkelen ikke kan settes utenom sin egen side.
I forhåndsvisnings-fanen merkes ukonfigurerte rader med "Standard: nekte" for alle fail-closed-typer (KAI.*, Freshdesk.*, Subscription.RuleAdmin, Subscription.ScheduleApply, Subscription.GoLiveSwitch) og "Standard: vis" for øvrige — avgjort av isFailClosedType (data-access-admin.component.html:270).
Maler (presets)¶
Knappen Bruk mal øverst åpner en dialog med tre forhåndsdefinerte profiler (data-access-admin.component.ts:516-568):
| Mal | Hva den gjør |
|---|---|
| Standard ansatt | Egne scope på personrelaterte typer, blant annet CRM-møter, CRM-avtaler, HMS-utførelser, HMS-avvik og lesestatus. Ingen KAI-tilgang. |
| Avdelingsleder | Department-scope på de fleste typer, inkludert CRM-avtaler, og kan opprette og redigere. Begrenset KAI-tilgang: KAI.Time, KAI.Approval, KAI.Project (view-only). |
| Administrator | All-scope + full CRUD på alle ObjectTypes i listen. |
Maler erstatter eksisterende regler for brukernivået.
Fane 2 — Avdelingstilgang¶
Gir én konkret bruker tilgang til avdelinger utover sin egen (data-access-admin.component.html:117-165). Skjemaet har to felt (data-access-admin.component.ts:127-130):
| Felt | Type | Validering |
|---|---|---|
userId |
ng-select med søk i brukerlisten | Påkrevd |
depNo |
ng-select med søk i avdelingslisten | Påkrevd |
Disse oppføringene leses inn av ResolveAccess når scope er Department eller SelectedDepartments — en bruker med scope SelectedDepartments ser kun avdelingene som er eksplisitt lagt til her (pluss egen avdeling).
Fane 3 — Regnskapstilgang (dimensjonsfilter)¶
Begrenser hvilke kontoer, avdelinger eller prosjekter et brukernivå har innsyn i på regnskapssiden (data-access-admin.component.html:167-224).
Felt i filter-dialogen¶
Form dimFilterForm (data-access-admin.component.ts:132-138):
| Felt | Type | Standard | Validering |
|---|---|---|---|
userLevelId |
Nedtrekk: brukernivå | (ingen) | Påkrevd |
dimension |
Nedtrekk: Konto / Avdeling / Prosjekt |
Konto |
Påkrevd |
rangeFrom |
Tall | (ingen) | Påkrevd |
rangeTo |
Tall | (ingen) | Påkrevd |
description |
Tekst (fri) | tom | — |
Kombinasjonslogikk¶
Fra info-banneret i toppen av fanen (no.json: DataAccess.dimFilterInfo):
- 0 regler = full regnskapstilgang for brukernivået.
- Flere regler innenfor samme dimensjon (f.eks. to konto-intervaller) kombineres med ELLER.
- Regler på tvers av dimensjoner (f.eks. ett konto-intervall + ett avdelings-intervall) kombineres med OG.
Fane 4 — Forhåndsvisning¶
Velg et brukernivå og se en read-only oversikt over effektiv tilgang for samtlige ObjectTypes (data-access-admin.component.html:226-289). Rader som ikke har en eksplisitt regel merkes med:
- "Standard: vis" for ordinære ObjectTypes (fallback
CanView = true). - "Standard: nekte" for alle fail-closed-typer:
KAI.*,Freshdesk.*,Subscription.RuleAdmin,Subscription.ScheduleApplyogSubscription.GoLiveSwitch.
Toppen av fanen viser teller <antall konfigurert> av <total> for å gi rask oversikt.
Slik gjør du¶
Endre en regel for et brukernivå¶
- Åpne Innstillinger → Portalinnstillinger → Datatilgang.
- Stå i fanen Rolletilgang, velg brukernivå i nedtrekket.
- Utvid riktig gruppe (CRM, HMS, KAI osv.) i akkordionen.
- Klikk blyant-ikonet på raden du vil endre.
- Juster
accessScopeog CRUD-flagg i modalen. - Klikk Lagre. Toast "Tilgangsregel lagret" bekrefter.
Legge til en regel for en ObjectType uten regel¶
- Stå i fanen Rolletilgang med brukernivå valgt.
- Utvid gruppen og finn raden som viser "Ikke konfigurert".
- Klikk +-knappen til høyre på raden.
- Velg scope og CRUD-flagg i modalen (default:
Own+ alle CRUD = på). - Klikk Lagre.
Aktivere KAI for et brukernivå¶
- Velg brukernivået i Rolletilgang.
- Utvid gruppen KAI AI-assistent.
- For hver KAI-type brukernivået skal ha tilgang til: klikk +, sett
canViewpå (og eventueltcanCreate/canEdit), velg scope, lagre. - Verifiser i Forhåndsvisning at radene ikke lenger har "Standard: nekte"-merket.
Bruke en mal¶
- Velg brukernivå i Rolletilgang.
- Klikk Bruk mal øverst til høyre.
- Velg Standard ansatt, Avdelingsleder eller Administrator.
- Klikk Bruk mal i modalen. Eksisterende regler for brukernivået oppdateres.
Gi en bruker tilgang til en annen avdeling¶
- Gå til fanen Avdelingstilgang.
- Klikk + Legg til avdelingstilgang.
- Velg bruker og avdeling i ng-selectene.
- Lagre. For at det skal slå inn må brukerens nivå ha scope
DepartmentellerSelectedDepartmentspå relevante ObjectTypes.
Legge til et regnskapsfilter¶
- Gå til fanen Regnskapstilgang.
- Klikk + Legg til filter.
- Velg brukernivå, dimensjon, Fra/Til-intervall og en beskrivelse.
- Lagre.
Vanlige problemer¶
Et brukernivå ser ingen data¶
Det finnes ingen regel for kombinasjonen brukernivå × ObjectType, og fallback er Own. Sjekk Forhåndsvisning — rader uten regel viser scope Egne (eller Standard: nekte for KAI). Legg til en regel eller bruk en mal.
KAI-funksjoner vises ikke / svarer "ingen tilgang"¶
KAI-typer er fail-closed. Uten en eksplisitt regel med CanView = true returnerer ResolveAccess CanView = false (DataAccessRepository.cs:592-598). Aktiver KAI manuelt per type, eller bruk Avdelingsleder- eller Administrator-malen.
"Avdeling"-scope returnerer tomt¶
Brukeren mangler userDepNo på sin ansatt-rad og har ingen oppføringer i wv_UserDepartmentAccess. Sett avdeling på ansatt-raden (Brukere), eller legg inn én eller flere rader i fanen Avdelingstilgang. Backend logger en LogWarning når dette skjer (DataAccessRepository.cs:629-636).
Endringen trådte ikke i kraft¶
API-laget bruker den nye regelen ved neste kall, men UI kan ha mellomlagret eldre tilgang. Be brukeren laste siden på nytt.
Lagre-knappen er deaktivert¶
Et påkrevd felt mangler. I regel-dialogen er accessScope påkrevd. I avdelings-dialogen er både userId og depNo påkrevd. I dimensjonsfilter-dialogen er userLevelId, dimension, rangeFrom og rangeTo påkrevd.
Feilmelding ved lagring¶
Toastene som faktisk vises (data-access-admin.component.ts): "Feil ved lagring av tilgangsregel", "Feil ved lagring av avdelingstilgang", "Feil ved lagring av dimensjonsfilter", "Feil ved lasting av tilgangsdata". Disse kommer fra API-feil eller manglende rettigheter — sjekk at innlogget bruker faktisk har administrator-tilgang.
Konsekvensanalyse før endring¶
- Antall berørte brukere: Hvor mange brukere har dette brukernivået?
- Eksponering av sensitive data: Vil et videre scope avsløre lønnsdata, klienttilbud eller personopplysninger?
- Tap av tilgang: Vil et smalere scope blokkere arbeidsoppgaver?
- Fail-closed-typer: Skrur du på
CanViewforKAI.*ellerFreshdesk.*(f.eks.Freshdesk.Ticketsfor Supportsaker) — er kost-/policy-vurderingen gjort? Kunder kan ha sensitiv informasjon i supportsaker. - GDPR / personvern:
AvdelingogAlleeksponerer flere personers data — er det avklart i tenantens databehandlerregister? - Reversibilitet: Endringen er reversibel, men eksponert data kan ikke "trekkes tilbake" hvis noen har lest dem.
Relaterte sider¶
- Brukere — administrer enkeltkontoer
- Brukergrupper — bulk-tilgang
- Ansatt tenant-tilgang — tilgang på tvers av tenants
- Ansatt-filter — leders godkjenningsrett per avdeling
- Innstillinger — oversikt





