Kontrol Akses Berbasis Peran (RBAC)
Modelkan peran dan izin pengguna, simpan dalam sesi, lalu terapkan pemeriksaan peran pada komponen server, pengendali rute, dan middleware dalam aplikasi Next.js 15.
Kontrol Akses Berbasis Peran (RBAC) adalah pelajaran Next.js 15 Fullstack Web Apps gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Next.js 15 Fullstack Web Apps, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Next.js 15 Fullstack Web Apps mencakup 4 pelajaran total.
Bagian dari pelajaran ini belum diterjemahkan dan ditampilkan dalam bahasa Inggris.
Authorization Beyond Login
Authentication answers who are you; authorization answers what may you do. Role-Based Access Control (RBAC) assigns each user one or more roles and grants permissions to roles instead of individuals.
- Roles:
admin,editor,viewer - Permissions are derived from the role.
Storing the Role in the JWT
With NextAuth, attach the role to the token in the jwt callback so it travels with every request without a database hit.
callbacks: {
async jwt({ token, user }) {
if (user) token.role = user.role;
return token;
},
async session({ session, token }) {
session.user.role = token.role;
return session;
},
}A Permissions Map
Centralize what each role can do. A simple map keeps checks consistent and easy to audit.
export const permissions = {
admin: ['read', 'write', 'delete'],
editor: ['read', 'write'],
viewer: ['read'],
};
export function can(role, action) {
return permissions[role]?.includes(action) ?? false;
}Testing the Helper
The can helper is pure logic, so it runs anywhere. Here is a self-contained check.
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'));Guarding a Server Component
Read the session on the server and redirect users who lack the required role before any sensitive UI renders.
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>;
}Guarding a Route Handler
API route handlers must enforce roles too. Never trust the client. Return 403 when the role is insufficient.
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 });
}Role Checks in Middleware
Middleware can block whole route groups early. Match an admin prefix and verify the token's role.
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*'] };Defense in Depth
Apply checks at multiple layers. Middleware gives a fast first gate, but always re-verify in the server component or route handler that actually touches data.
- Middleware: coarse routing gate.
- Server component / handler: authoritative check.
Hiding UI Conditionally
Hide controls users cannot use, but remember UI hiding is convenience, not security. The server must still reject unauthorized actions.
export default async function Toolbar() {
const session = await auth();
return (
<div>
{can(session?.user.role, 'delete') && <DeleteButton />}
</div>
);
}Multiple Roles and Scopes
Real apps often give a user several roles or fine-grained scopes. Store an array and check membership. This scales toward permission-based (ABAC) systems later.
function hasRole(userRoles, required) {
return userRoles.some((r) => r === required);
}
console.log(hasRole(['editor', 'viewer'], 'editor'));Common Pitfalls
Avoid these RBAC mistakes:
- Trusting a role sent from the client body.
- Checking roles only in the UI.
- Forgetting to re-issue the JWT after a role change.
- Hardcoding role strings instead of a central map.
Quick Check
Where is the authoritative place to enforce that only admins can delete a record?
Recap
You implemented RBAC end to end:
- Stored the role in the JWT and session via NextAuth callbacks.
- Centralized permissions with a
can()helper. - Guarded server components, route handlers, and middleware.
- Applied defense in depth and avoided client-trust pitfalls.
Belajar TypeScript dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 12
- Pelajaran
- 48
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Kontrol Akses Berbasis Peran (RBAC)” gratis?
Ya — teks lengkap “Kontrol Akses Berbasis Peran (RBAC)” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Next.js 15 Fullstack Web Apps, upgrade ke CoddyKit PRO. Kursus Next.js 15 Fullstack Web Apps mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Kontrol Akses Berbasis Peran (RBAC)”?
Modelkan peran dan izin pengguna, simpan dalam sesi, lalu terapkan pemeriksaan peran pada komponen server, pengendali rute, dan middleware dalam aplikasi Next.js 15. Kamu berlatih Next.js 15 Fullstack Web Apps dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Next.js 15 Fullstack Web Apps?
Tidak diperlukan pengalaman sebelumnya. Next.js 15 Fullstack Web Apps di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Kontrol Akses Berbasis Peran (RBAC)” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Next.js 15 Fullstack Web Apps ini?
Ya. Setiap pelajaran Next.js 15 Fullstack Web Apps menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mengintegrasikan NextAuth.js
- Pengelolaan Sesi dan JWT
- Middleware dan Pengendalian Akses
- Kontrol Akses Berbasis Peran (RBAC)