---
title: Authentication & RBAC
description: Protect your documentation with authentication and control page access using role-based permissions.
---
CamelMind includes built-in support for authentication and role-based access control (RBAC).
Authentication identifies who a user is, while RBAC determines which pages they're allowed to access.
Authentication is **disabled by default**, so a new CamelMind site is completely public until you enable it.
---
## Choose an authentication mode
CamelMind supports three authentication modes.
| Mode | Description |
| --- | --- |
| **Public** (default) | Anyone can access every page. |
| **Partial login** | Public pages remain accessible, but users can sign in to access protected pages. |
| **Required login** | All pages require authentication. |
Protected documentation pages automatically restrict access to related features, such as viewing the page or downloading its Markdown source.
Offline and PDF downloads follow your site's authentication settings automatically. If authentication is enabled, only authenticated users can download these artifacts. If authentication is disabled, the downloads are publicly accessible.
---
## Enable authentication
Authentication is configured in `camelmind.config.ts`.
```typescript
auth: {
enabled: true,
requireLogin: true,
provider: "oidc",
oidc: {
issuer: process.env.OIDC_ISSUER ?? "",
clientId: process.env.OIDC_CLIENT_ID ?? "",
clientSecret: process.env.OIDC_CLIENT_SECRET ?? "",
rolesClaim: "realm_access.roles",
roleMapping: {},
},
publicPaths: [
"/",
"/home",
"/login",
"/api/auth",
],
}
```
Most authentication settings are supplied through environment variables.
```bash
CAMELMIND_AUTH_ENABLED=true
CAMELMIND_AUTH_REQUIRE_LOGIN=true
CAMELMIND_AUTH_PROVIDER=oidc
OIDC_ISSUER=https://auth.example.com/realms/my-realm
OIDC_CLIENT_ID=my-docs
OIDC_CLIENT_SECRET=super-secret
SESSION_SECRET=your-random-session-secret
```
---
## Configure your identity provider
CamelMind works with any OpenID Connect (OIDC) compatible identity provider, including:
- Auth0
- Okta
- Microsoft Entra ID (Azure AD)
- Amazon Cognito
- Any standards-compliant OIDC provider
Your identity provider should be configured to:
1. Register CamelMind as an application.
2. Set the redirect URI to:
```
https://your-site.example.com/api/auth/callback
```
3. Include user roles in the ID token or access token.
CamelMind reads user roles from the claim specified by `rolesClaim`.
For example, Keycloak stores realm roles in:
```typescript
rolesClaim: "realm_access.roles"
```
---
## Map provider roles
Your identity provider's role names don't have to match the role names used in your documentation.
Use `roleMapping` to translate them.
```typescript
roleMapping: {
"Realm_Admin": "admin",
"Realm_Vendor": "vendor",
}
```
This lets you keep your navigation configuration simple while adapting to existing enterprise role names.
---
## Restrict pages
Access is controlled directly in `nav.yml`.
```yaml
- label: Admin Dashboard
slug: /admin/dashboard
file: content/admin/dashboard.mdx
roles: [admin]
- label: Vendor Portal
slug: /vendor
file: content/vendor.mdx
roles: [vendor]
- label: Getting Started
slug: /getting-started
file: content/getting-started.mdx
roles: []
```
The `roles` field determines who can access each page.
| `roles` | Access |
| --- | --- |
| `[]` | Any authenticated user |
| `["admin"]` | Administrators only |
| `["vendor","admin"]` | Vendors or administrators |
When authentication is disabled, every page is treated as public regardless of the `roles` setting.
---
## How access is enforced
CamelMind protects documentation in two ways.
=== "Navigation filtering"
Pages the current user cannot access are automatically hidden from the navigation.
=== "Route protection"
Even if someone knows the URL, CamelMind blocks access unless the user has the required role.
===
Hiding a page from the navigation is not the security mechanism—CamelMind also validates permissions before rendering the page.
---
## Public pages
When `requireLogin` is enabled, pages listed in `publicPaths` remain accessible without signing in.
```typescript
publicPaths: [
"/",
"/home",
"/login",
"/api/auth",
]
```
This is commonly used for:
- Home pages
- Login pages
- Marketing pages
- Authentication endpoints
---
# Local development
During development you can use the built-in mock authentication provider.
```typescript
auth: {
enabled: true,
requireLogin: false,
provider: "dev-mock",
}
```
The mock provider simulates a signed-in user without requiring an external identity provider.
This makes it easy to test navigation, protected pages, and role-based access while developing locally.
Never deploy with `provider: "dev-mock"`. It bypasses real authentication and is intended for local development only.