Access Control
Implement fine-grained access control with roles, permissions, and policies. AccessIQ provides flexible RBAC that scales from simple to complex authorization requirements.
Overview
AccessIQ's access control system is built on three core concepts:
Permissions
Granular actions that can be performed on resources
Roles
Collections of permissions assigned to users
Policies
Conditional rules for dynamic access decisions
Permissions
Permissions follow a resource:action naming convention. Define permissions that match your application's domain model.
// Permission structure
{
"permissions": [
"users:read", // View user data
"users:write", // Create/update users
"users:delete", // Delete users
"roles:manage", // Manage role definitions
"billing:view", // View billing information
"billing:manage", // Manage billing settings
"settings:read", // View organization settings
"settings:write", // Modify organization settings
"reports:export" // Export data reports
]
}resource:action format where action is one of: read, write, delete, manage, export, etc.Roles
Roles are named collections of permissions. Users are assigned roles rather than individual permissions.
curl -X POST https://api.accessiq.io/v1/roles \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Project Manager",
"description": "Manages projects and team members",
"permissions": [
"users:read",
"users:write",
"projects:read",
"projects:write",
"reports:export"
],
"isDefault": false
}'Default Roles
AccessIQ provides built-in roles that you can use or customize:
Full access to all resources, can manage billing and delete organization
Administrative access, can manage users and settings
Standard access to organization resources
Read-only access to resources
Checking Permissions
Permissions are included in the JWT token claims. Check permissions in your application:
import { getSession } from '@/lib/auth'
export function hasPermission(
permissions: string[],
required: string
): boolean {
return permissions.includes(required)
}
export function hasAnyPermission(
permissions: string[],
required: string[]
): boolean {
return required.some(p => permissions.includes(p))
}
export function hasAllPermissions(
permissions: string[],
required: string[]
): boolean {
return required.every(p => permissions.includes(p))
}
// Usage in API route
export async function GET(request: Request) {
const session = await getSession()
if (!hasPermission(session.permissions, 'users:read')) {
return new Response('Forbidden', { status: 403 })
}
// ... handle request
}Role Hierarchies
Roles can be scoped at different levels for maximum flexibility:
Tenant Roles
Defined at the platform level, available to all organizations. Ideal for standard roles that apply across your customer base.
Organization Roles
Custom roles defined by individual organizations. Allows customers to create roles specific to their internal structure.
- Start with minimal permissions and add more as needed
- Use descriptive role names that match your domain
- Avoid giving users direct permissions; use roles instead
- Document what each permission allows
- Regularly audit role assignments