This document provides a quick reference of all changes made to implement the RBAC system.
File: src/types/rbac.ts
- Exported:
UserRoleenum (5 roles) - Exported:
Permissionenum (23 permissions) - Exported:
ROLE_PERMISSIONSmapping - Exported:
RouteAccess,UserWithRole,PermissionCheckResulttypes
File: src/permissions/rbac.ts
- Exported:
hasMinimumRole(),getRolePermissions(),hasPermission() - Exported:
hasAllPermissions(),hasAnyPermission(),checkPermissions() - Exported:
canAccessRoute(),getMissingPermissions() - Exported:
isAdmin(),isSuperAdmin(),getUserRole() - Exported:
assignRole(),grantPermissions()(placeholder for backend)
File: src/permissions/routes.ts
- Exported:
ROUTE_ACCESS_CONFIGarray - Exported:
getRouteAccess(),isPublicRoute(),requiresAuth(),getMinimumRole()
File: src/permissions/index.ts
- Re-exports all utilities from
rbac.tsandroutes.ts - Re-exports types from
@/types/rbac
File: src/contexts/RBACContext.tsx
- Exported:
RBACProvidercomponent - Exported:
useRBAC()hook (main hook) - Exported:
usePermission()hook (single permission) - Exported:
usePermissions()hook (multiple permissions) - Exported:
useRole()hook (role check)
File: src/components/guards/PermissionGuard.tsx
- Exported:
PermissionGuardcomponent - Props:
permission,permissions,anyPermission,minRole,fallback,hideOnDenied
File: src/components/guards/RouteGuard.tsx
- Exported:
RouteGuardcomponent - Exported:
withRouteGuard()HOC - Exported:
AccessDeniedcomponent
File: src/components/guards/index.ts
- Re-exports
PermissionGuard,RouteGuard,withRouteGuard,AccessDenied
File: src/components/RoleAwareNav.tsx
- Exported:
RoleAwareNavcomponent - Exported:
NavItemtype - Exported:
mainNavItemsarray (pre-configured) - Exported:
adminNavItemsarray (pre-configured)
File: docs/RBAC.md
- Complete system documentation
- Usage examples
- Security considerations
- Testing guide
- Troubleshooting
File: RBAC_IMPLEMENTATION.md
- Detailed implementation notes
- Design decisions
- Security notes
- Testing checklist
- Q&A section
File: COMMIT_GUIDE.md
- Step-by-step commit instructions
- PR template
- Verification steps
File: RBAC_QUICK_START.md
- Quick usage examples
- Common patterns
- Troubleshooting tips
File: commit-rbac.bat
- Automated commit script for Windows
- Creates 3 commits as requested
File: src/middleware.ts
Changes:
// Added imports
import { isPublicRoute, requiresAuth } from "@/permissions/routes";
// Simplified logic to use RBAC route config
if (isPublicRoute(pathname)) {
return NextResponse.next();
}
if (requiresAuth(pathname)) {
// ... authentication check
}Impact: Middleware now uses centralized route configuration instead of hardcoded paths.
File: src/pages/_app.tsx
Changes:
// Added import
import { RBACProvider } from "@/contexts/RBACContext";
// Added to component tree (after WalletProvider)
<WalletProvider>
<RBACProvider>
<ProvidersInner ... />
</RBACProvider>
</WalletProvider>
// Fixed ProvidersInner to properly render childrenImpact: RBAC context is now available throughout the application.
File: src/contexts/WalletContext.tsx
Changes:
// Added imports
import {
getAvailableWallets,
connectWallet,
disconnectWallet,
switchWallet as switchWalletService,
restoreSession,
pollSession,
} from "@/services/walletService";
import type { WalletId, WalletMeta } from "@/types/wallet";
// Fixed duplicate code in disconnect function
// Fixed undefined 'address' reference in connect functionImpact: Fixed bugs and ensured proper wallet service integration.
File: src/components/Navbar.tsx
Changes:
// Added useMemo for activeWalletMeta
const activeWalletMeta = useMemo(
() => availableWallets.find((w) => w.id === walletType),
[availableWallets, walletType]
);Impact: Fixed undefined variable that would cause runtime errors.
| Category | Files | Lines |
|---|---|---|
| Types | 1 | ~200 |
| Utilities | 3 | ~350 |
| React Components | 5 | ~500 |
| Documentation | 5 | ~800 |
| Total | 14 | ~1,850 |
| Commit | Files | Purpose |
|---|---|---|
| 1. Core | 4 | Types and utilities |
| 2. React | 6 | Context and guards |
| 3. Docs | 8 | Documentation and integration |
// Main hook - provides all functionality
const { user, role, hasPermission, isAdmin } = useRBAC();
// Convenience hooks
const canView = usePermission(Permission.VIEW_ANALYTICS);
const canManage = usePermissions([Permission.CREATE, Permission.DELETE]);
const isAtLeastPowerUser = useRole(UserRole.POWER_USER);// Component-level
<PermissionGuard permission={Permission.VIEW_ANALYTICS}>
<Content />
</PermissionGuard>
// Page-level
<RouteGuard minRole={UserRole.ADMIN}>
<AdminPage />
</RouteGuard>
// HOC pattern
export default withRouteGuard(MyPage);// Check permissions
const user = getUserRole(address);
const canAccess = hasPermission(user, Permission.VIEW_ANALYTICS);
const result = checkPermissions(user, [Permission.CREATE], UserRole.ADMIN);
// Route checks
const routeAccess = getRouteAccess("/analytics");
const canAccess = canAccessRoute(user, routeAccess);// Types
import { UserRole, Permission } from "@/types/rbac";
// Utilities
import { hasPermission, getUserRole } from "@/permissions";
// Context & Hooks
import { useRBAC, usePermission } from "@/contexts/RBACContext";
// Guards
import { PermissionGuard, RouteGuard, withRouteGuard } from "@/components/guards";
// Navigation
import { RoleAwareNav, mainNavItems } from "@/components/RoleAwareNav";- Add to
UserRoleenum insrc/types/rbac.ts - Add to
ROLE_HIERARCHYinsrc/permissions/rbac.ts - Add permissions to
ROLE_PERMISSIONSinsrc/types/rbac.ts
- Add to
Permissionenum insrc/types/rbac.ts - Add to appropriate roles in
ROLE_PERMISSIONS - Use in guards/checks as needed
- Add to
ROUTE_ACCESS_CONFIGinsrc/permissions/routes.ts - Or wrap page with
RouteGuardcomponent - Or use
withRouteGuard()HOC
- Connect wallet (should get USER role)
- Check navigation menu (items should filter based on role)
- Access
/dashboard(should work for USER) - Access
/analytics(should require POWER_USER) - Access
/admin(should require ADMIN) - Disconnect wallet (should revert to GUEST)
- Check component guards hide/show correctly
- Unit tests for permission utilities
- Unit tests for role hierarchy
- Integration tests for PermissionGuard
- Integration tests for RouteGuard
- E2E tests for role-based flows
- Identify pages that need protection
- Determine required role/permissions
- Add RouteGuard or use withRouteGuard
- Test access with different roles
- Implement role storage (database/contract)
- Create API endpoints for role management
- Update
getUserRole()to fetch from backend - Add server-side permission validation
- Implement session management
- Add audit logging
None. All changes are additive and backward compatible.
No new dependencies added. Uses existing React and Next.js features.
Compatible with all browsers supported by Next.js 14:
- Chrome (latest)
- Firefox (latest)
- Safari (latest)
- Edge (latest)
Minimal:
- Permission checks are memoized
- Context values are optimized with
useMemo - No additional network requests
- Route config lookup is O(n) where n ≈ 10-20
- ✅ Semantic HTML preserved
- ✅ ARIA labels on loading states
- ✅ Screen reader friendly error messages
- ✅ Keyboard navigation maintained
- ✅ Focus management in guards
- Client-side only: Current implementation is not secure for production
- Default role: All users get USER role by default
- No persistence: Roles reset on page refresh (until backend integration)
- No audit log: Permission checks are not logged
- No role management UI: Must be added separately
- Add unit tests
- Add integration tests
- Create example pages with guards
- Backend role storage
- API endpoints
- Admin UI for role management
- Smart contract integration
- Time-based permissions
- Multi-factor authorization
- Audit dashboard
- Full Documentation:
docs/RBAC.md - Quick Start:
RBAC_QUICK_START.md - Implementation Details:
RBAC_IMPLEMENTATION.md - Commit Instructions:
COMMIT_GUIDE.md
Last Updated: 2026-06-25
Version: 1.0.0
Status: ✅ Complete and Ready for Review