forbidden
Source URL: https://nextjs.org/docs/app/api-reference/functions/forbidden
forbidden
Section titled “forbidden”This feature is currently experimental and subject to change, it is not recommended for production.
The forbidden function throws an error that renders a Next.js 403 error page. It’s useful for handling authorization errors in your application. You can customize the UI using the forbidden.js file.
To start using forbidden, enable the experimental authInterrupts configuration option in your next.config.js file:
import type { NextConfig } from 'next'
const nextConfig: NextConfig = { experimental: { authInterrupts: true, },}
export default nextConfigmodule.exports = { experimental: { authInterrupts: true, },}forbidden can be invoked in Server Components, Server Functions, and Route Handlers.
import { verifySession } from '@/app/lib/dal'import { forbidden } from 'next/navigation'
export default async function AdminPage() { const session = await verifySession()
// Check if the user has the 'admin' role if (session.role !== 'admin') { forbidden() }
// Render the admin page for authorized users return <></>}import { verifySession } from '@/app/lib/dal'import { forbidden } from 'next/navigation'
export default async function AdminPage() { const session = await verifySession()
// Check if the user has the 'admin' role if (session.role !== 'admin') { forbidden() }
// Render the admin page for authorized users return <></>}Good to know
Section titled “Good to know”- The
forbiddenfunction cannot be called in the root layout.
Examples
Section titled “Examples”Role-based route protection
Section titled “Role-based route protection”You can use forbidden to restrict access to certain routes based on user roles. This ensures that users who are authenticated but lack the required permissions cannot access the route.
import { verifySession } from '@/app/lib/dal'import { forbidden } from 'next/navigation'
export default async function AdminPage() { const session = await verifySession()
// Check if the user has the 'admin' role if (session.role !== 'admin') { forbidden() }
// Render the admin page for authorized users return ( <main> <h1>Admin Dashboard</h1> <p>Welcome, {session.user.name}!</p> </main> )}import { verifySession } from '@/app/lib/dal'import { forbidden } from 'next/navigation'
export default async function AdminPage() { const session = await verifySession()
// Check if the user has the 'admin' role if (session.role !== 'admin') { forbidden() }
// Render the admin page for authorized users return ( <main> <h1>Admin Dashboard</h1> <p>Welcome, {session.user.name}!</p> </main> )}Mutations with Server Actions
Section titled “Mutations with Server Actions”When implementing mutations in Server Actions, you can use forbidden to only allow users with a specific role to update sensitive data.
'use server'
import { verifySession } from '@/app/lib/dal'import { forbidden } from 'next/navigation'import db from '@/app/lib/db'
export async function updateRole(formData: FormData) { const session = await verifySession()
// Ensure only admins can update roles if (session.role !== 'admin') { forbidden() }
// Perform the role update for authorized users // ...}'use server'
import { verifySession } from '@/app/lib/dal'import { forbidden } from 'next/navigation'import db from '@/app/lib/db'
export async function updateRole(formData) { const session = await verifySession()
// Ensure only admins can update roles if (session.role !== 'admin') { forbidden() }
// Perform the role update for authorized users // ...}Version History
Section titled “Version History”| Version | Changes |
|---|---|
v15.1.0 | forbidden introduced. |
- forbidden.js
- API reference for the forbidden.js special file.