Next.js 15-fullstackwebapps · Lektion

Rollebaseret adgangskontrol (RBAC)

Modellér brugerroller og tilladelser, gem dem i sessionen, og håndhæv rolletjek på tværs af serverkomponenter, route handlers og middleware i en Next.js 15-app.

Lektion 4 af 413 trin

Rollebaseret adgangskontrol (RBAC) er en gratis Next.js 15-fullstackwebapps-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Next.js 15-fullstackwebapps, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Next.js 15-fullstackwebapps-kurset indeholder 4 lektioner i alt.

Autorisation ud over login

Godkendelse besvarer hvem er du; autorisation besvarer hvad må du gøre. Role-Based Access Control (RBAC) tildeler hver bruger en eller flere roller og giver roller tilladelser i stedet for enkeltpersoner.

  • Roller: admin, editor, viewer
  • Tilladelser udledes af rollen.

Lagring af rollen i JWT

Med NextAuth føjer du rollen til tokenet i jwt-callbacken, så den følger med hver forespørgsel uden et opslag i databasen.

callbacks: {
  async jwt({ token, user }) {
    if (user) token.role = user.role;
    return token;
  },
  async session({ session, token }) {
    session.user.role = token.role;
    return session;
  },
}

Et tilladelseskort

Centralisér, hvad hver rolle må gøre. Et enkelt kort holder kontrollerne ensartede og nemme at revidere.

export const permissions = {
  admin: ['read', 'write', 'delete'],
  editor: ['read', 'write'],
  viewer: ['read'],
};

export function can(role, action) {
  return permissions[role]?.includes(action) ?? false;
}

Test af hjælpefunktionen

Hjælpefunktionen can indeholder ren logik, så den kan køre hvor som helst. Her er en selvstændig kontrol.

const permissions = {
  admin: ['read', 'write', 'delete'],
  editor: ['read', 'write'],
  viewer: ['read'],
};
function can(role, action) {
  return permissions[role]?.includes(action) ?? false;
}
console.log(can('editor', 'write'));
console.log(can('viewer', 'delete'));

Beskyttelse af en Server Component

Læs sessionen på serveren, og omdirigér brugere, der mangler den krævede rolle, før følsom brugerflade vises.

import { auth } from '@/auth';
import { redirect } from 'next/navigation';

export default async function AdminPage() {
  const session = await auth();
  if (session?.user.role !== 'admin') redirect('/');
  return <h1>Admin Dashboard</h1>;
}

Beskyttelse af en rutehåndtering

API-rutehåndteringer skal også håndhæve roller. Stol aldrig på klienten. Returnér 403, når rollen ikke er tilstrækkelig.

import { auth } from '@/auth';
import { can } from '@/lib/rbac';

export async function DELETE(req) {
  const session = await auth();
  if (!can(session?.user.role, 'delete')) {
    return new Response('Forbidden', { status: 403 });
  }
  return Response.json({ ok: true });
}

Rollekontroller i middleware

Middleware kan blokere hele rutegrupper tidligt. Match et admin-præfiks, og kontrollér tokenets rolle.

import { NextResponse } from 'next/server';

export function middleware(req) {
  const role = req.cookies.get('role')?.value;
  if (req.nextUrl.pathname.startsWith('/admin') && role !== 'admin') {
    return NextResponse.redirect(new URL('/login', req.url));
  }
  return NextResponse.next();
}

export const config = { matcher: ['/admin/:path*'] };

Forsvar i dybden

Anvend kontroller på flere lag. Middleware giver en hurtig første port, men kontrollér altid igen i den Server Component eller rutehåndtering, der faktisk tilgår data.

  • Middleware: grov ruteport.
  • Server Component / håndtering: autoritativ kontrol.

Betinget skjul af brugerflade

Skjul kontroller, som brugerne ikke kan bruge, men husk, at skjul af brugerfladen er bekvemmelighed og ikke sikkerhed. Serveren skal stadig afvise uautoriserede handlinger.

export default async function Toolbar() {
  const session = await auth();
  return (
    <div>
      {can(session?.user.role, 'delete') && <DeleteButton />}
    </div>
  );
}

Flere roller og scopes

Rigtige apps giver ofte en bruger flere roller eller detaljerede scopes. Gem et array, og kontrollér medlemskab. Det kan senere skaleres mod tilladelsesbaserede (ABAC) systemer.

function hasRole(userRoles, required) {
  return userRoles.some((r) => r === required);
}
console.log(hasRole(['editor', 'viewer'], 'editor'));

Almindelige faldgruber

Undgå disse RBAC-fejl:

  • At stole på en rolle, der sendes fra klientens body.
  • Kun at kontrollere roller i brugerfladen.
  • At glemme at udstede JWT igen efter en ændring af rollen.
  • At hardkode rollestrenge i stedet for at bruge et centralt kort.

Hurtigt tjek

Hvor er det autoritative sted at håndhæve, at kun administratorer må slette en post?

Opsummering

Du har implementeret RBAC fra ende til anden:

  • Gemt rollen i JWT og sessionen via NextAuth-callbacks.
  • Centraliseret tilladelser med hjælpefunktionen can().
  • Beskyttet Server Components, rutehåndteringer og middleware.
  • Anvendt forsvar i dybden og undgået faldgruber ved at stole på klienten.
Gratis at komme i gang

Lær TypeScript med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
12
Lektioner
48

Ofte stillede spørgsmål

Er lektionen “Rollebaseret adgangskontrol (RBAC)” gratis?

Ja — alle 3 lektioner i læringssporet Next.js 15-fullstackwebapps, inklusive “Rollebaseret adgangskontrol (RBAC)”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Next.js 15-fullstackwebapps-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Rollebaseret adgangskontrol (RBAC)”?

Modellér brugerroller og tilladelser, gem dem i sessionen, og håndhæv rolletjek på tværs af serverkomponenter, route handlers og middleware i en Next.js 15-app. Du øver dig i Next.js 15-fullstackwebapps med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Next.js 15-fullstackwebapps?

Der kræves ingen tidligere erfaring. Next.js 15-fullstackwebapps på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “Rollebaseret adgangskontrol (RBAC)”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Next.js 15-fullstackwebapps-lektion?

Ja. Alle Next.js 15-fullstackwebapps-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Integration af NextAuth.js
  2. Sessionshåndtering og JWT'er
  3. Middleware og adgangskontrol
  4. Rollebaseret adgangskontrol (RBAC)
← Tilbage til Next.js 15-fullstackwebapps