Authorization Best Practices
Authorization ensures users can only access resources and perform actions they're permitted to. Proper authorization prevents privilege escalation and data breaches.
Quick Navigation: Authorization Patterns • Best Practices
Quick Decision Guide
Quick Implementation Guide:
RBAC Pattern: Users → Roles → Permissions
const roles = { admin: ['read','write','delete'], editor: ['read','write'], viewer: ['read'] };
function can(user, action) { return roles[user.role]?.includes(action); }Resource Ownership Check: Always verify user owns resource:
if (post.authorId !== user.id && !can(user, 'delete')) return 403;Server-Side Validation: NEVER trust client-side checks. Always validate permissions on server for every request.
Middleware Pattern: Create auth middleware:
function requirePermission(action) {
return (req, res, next) => {
if (!can(req.user, action)) return res.status(403).json({ error: 'Forbidden' });
next();
};
}Common Mistake: Assuming authenticated = authorized. Always check permissions, not just authentication.
Authorization Patterns
Principle of Least Privilege
Users should have minimum necessary permissions to perform their tasks.
Role-Based Access Control (RBAC)
Structure:
Implementation:
const roles = {
admin: ['read', 'write', 'delete', 'manage'],
editor: ['read', 'write'],
viewer: ['read']
};
function checkPermission(user, resource, action) {
const userPermissions = roles[user.role] || [];
return userPermissions.includes(action);
}Resource-Level Authorization
Check ownership:
Best Practices
Always Verify on Server
Never trust client-side checks:
Fail Securely
Default to deny:
Centralize Authorization Logic
Single source of truth: