API-reference

RBAC-matrix

Hvilken rolle må hvad — opslag per ressource og handling.

Reference for adgangskontrol. Den autoritative kilde er lib/authz.ts — denne side er en menneskelæsbar gengivelse.

Roller

RolleTildeles viaTypisk bruger
ORG_ADMINEntra-gruppeOrganisations-admin
DEPT_ADMINEntra-gruppe (org-wide) eller manuelt (per afdeling)Afdelingsleder
COORDINATOREntra-gruppe (org-wide) eller manuelt (per afd/team)Team-koordinator
RESOURCEBaseline ved loginAlle medarbejdere
VIEWERManuelt af ORG_ADMINLæseadgang (revision, ledelse)

Scope-typer

scopeTypescopeId peger påEffekt
ORGOrganisationens IDWildcard — gælder alle afdelinger/teams
DEPTAfdelings-IDKun den ene afdeling
TEAMTeam-ID (kun COORDINATOR)Kun det ene team

Entra-gruppe-mapping giver altid ORG-scope. For at begrænse en DEPT_ADMIN eller COORDINATOR til specifikke afdelinger/teams skal rollen tildeles manuelt med DEPT- eller TEAM-scope (og brugeren må ikke samtidig være medlem af den org-wide Entra-gruppe).

Matrix: ressource × handling × rolle

= tilladt · = ikke tilladt · (egen) = kun for egne data · (scope) = kun i eget scope

team — afdelinger & teams

HandlingORG_ADMINDEPT_ADMINCOORDINATORRESOURCEVIEWER
view
edit✓ (scope)✓ (eget team)
delete✓ (scope)

user — brugere

HandlingORG_ADMINDEPT_ADMINCOORDINATORRESOURCEVIEWER
view✓ (scope)✓ (scope)✓ (egen)✓ (org)
edit✓ (scope)✓ (egen)

project — projekter

HandlingORG_ADMINDEPT_ADMINCOORDINATORRESOURCEVIEWER
view
edit✓ (scope)✓ (scope)
delete✓ (scope)

assignment — allokeringer

HandlingORG_ADMINDEPT_ADMINCOORDINATORRESOURCEVIEWER
view
edit/delete✓ (scope)✓ (scope)✓ (egen)

leave — fravær

HandlingORG_ADMINDEPT_ADMINCOORDINATORRESOURCEVIEWER
view
edit/delete✓ (scope)✓ (scope)✓ (egen)

time-entry — tidsregistrering

HandlingORG_ADMINDEPT_ADMINCOORDINATORRESOURCEVIEWER
view✓ (scope)✓ (scope)✓ (egen)✓ (dept)
edit/delete✓ (scope)✓ (scope)✓ (egen)

forecast-plan — forecast

HandlingORG_ADMINDEPT_ADMINCOORDINATORRESOURCEVIEWER
view
edit/delete✓ (scope)✓ (scope)

insights — analyser & dashboards

HandlingORG_ADMINDEPT_ADMINCOORDINATORRESOURCEVIEWER
view✓ (scope)✓ (scope)✓ hvis isManager✓ (org)

config / audit

HandlingORG_ADMINAlle andre
view/edit

Special-flags

FlagEffekt
User.isManagerGiver insights:view uden separat rolle
UserTeam.isCoordinatorMarkerer brugeren som koordinator for et team; ikke det samme som COORDINATOR-rollen — flag'et bruges af UI'et, rollen af authz

Helper-funktioner

FunktionReturnerer
requireSession()Session | null — null hvis ikke logget ind
can(session, action, resource)boolean
getAdministeredDeptIds(roles)null (wildcard) eller string[] af afdelings-IDs
getAdministeredOrCoordinatedDeptIds(roles)Som ovenfor, men inkluderer COORDINATOR-DEPT

Eksempel: tjek i en route-handler

import { auth } from "@/auth"
import { can } from "@/lib/authz"
 
export async function PATCH(req, { params }) {
  const session = await auth()
  if (!session) return new Response("Unauthorized", { status: 401 })
 
  const assignment = await db.assignment.findUnique({
    where: { id: params.id },
    select: { organizationId: true, departmentId: true, userId: true },
  })
  if (!assignment) return new Response("Not Found", { status: 404 })
 
  const allowed = can(session, "edit", {
    type: "assignment",
    ...assignment,
  })
  if (!allowed) return new Response("Forbidden", { status: 403 })
 
  // ... write
}

Læs videre i RBAC scope-model for hvorfor ORG-scope fungerer som wildcard.