mirror of https://github.com/buster-so/buster.git
3.6 KiB
3.6 KiB
Access Controls Package - Claude Guidance
This package provides comprehensive access control functionality for Buster, migrated from the Rust sharing
and dataset_security
libraries.
Key Implementation Details
Migration Status
- ✅ Asset permissions (from
sharing
library) - ✅ Dataset permissions (from
dataset_security
library) - ✅ Cascading permissions
- ✅ LRU caching (replacing Redis)
- ✅ User lookup utilities
- ✅ Tests written (148 tests passing, 3 skipped)
- ⏳ Integration with existing handlers needs to be done
Architecture Decisions
-
Type Organization
- Internal types live in
src/types/
- API request/response types live in
@buster/server-shared
- Database queries live in
@buster/database
- Internal types live in
-
Caching Strategy
- Using LRU cache instead of Redis (as requested)
- 30-second TTL with updateAgeOnGet
- Separate caches for permissions and cascading checks
- Comprehensive invalidation strategies
-
Error Handling
- All errors throw
AccessControlError
with specific codes - Errors include context for debugging
- Consistent error patterns across modules
- All errors throw
Key Functions
Asset Permissions
hasAssetPermission
- Main permission check (includes caching)createPermissionByEmail
- Grant access by emaillistPermissions
- List all permissions for an assetremovePermissionByEmail
- Revoke access
Dataset Permissions
getPermissionedDatasets
- Get all accessible datasetscheckDatasetAccess
- Check access to specific datasetcheckMultipleDatasetAccess
- Batch access check
Cascading Permissions
- Metrics inherit from dashboards, chats, collections
- Dashboards inherit from chats, collections
- Chats inherit from collections
Performance Optimizations
-
Caching
- Permission results cached for 30 seconds
- Cascading checks cached separately
- Cache invalidation on permission changes
-
Database Queries
- Optimized queries in
@buster/database
- Batch operations where possible
- Proper indexing assumed
- Optimized queries in
Integration Points
-
With Existing Code
- Legacy exports maintained for backward compatibility
- Drop-in replacement for Rust libraries
- Same permission model and roles
-
With Other Packages
- Uses
@buster/database
for data access - Uses
@buster/database/supabase
for user creation - Exports to
@buster/server-shared
for API types
- Uses
Testing Strategy
Tests should cover:
- Permission CRUD operations
- Cascading permission logic
- Cache behavior and invalidation
- Error scenarios
- Legacy compatibility
Common Patterns
// Always check permissions before operations
const canEdit = await hasAssetPermission({
userId,
assetId,
assetType: 'dashboard',
requiredRole: 'can_edit'
});
if (!canEdit) {
throw new AccessControlError('permission_denied', 'Cannot edit dashboard');
}
// Invalidate cache after changes
await createPermissionByEmail({ ... });
invalidateUserAsset(userId, assetId, assetType);
Future Improvements
- Consider caching full permission results (not just booleans)
- Add metrics/monitoring for cache performance
- Implement permission inheritance for teams
- Add audit logging for permission changes
Debugging Tips
- Use
getCacheStats()
to monitor cache performance - Check
AccessControlError.details
for context - Enable debug logging in database queries
- Use
clearAllCaches()
to test without cache
Important Notes
- Never hard delete permissions (soft delete only)
- Always use upsert logic for permission creation
- Cache invalidation is critical for correctness
- Test cascading permissions thoroughly