Enhance role-check system with stricter checks (#15392)
## Overview This PR strengthens our permission system by introducing more granular role-based access control across the platform. ## Changes ### New Permissions Added - **Applications** - Control who can install and manage applications - **Layouts** - Control who can customize page layouts and UI structure - **AI** - Control access to AI features and agents - **Upload File** - Separate permission for file uploads - **Download File** - Separate permission for file downloads (frontend visibility) ### Security Enhancements - Implemented whitelist-based validation for workspace field updates - Added explicit permission guards to core entity resolvers - Enhanced ESLint rule to enforce permission checks on all mutations - Created `CustomPermissionGuard` and `NoPermissionGuard` for better code documentation ### Affected Components - Core entity resolvers: webhooks, files, domains, applications, layouts, postgres credentials - Workspace update mutations now use whitelist validation - Settings UI updated with new permission controls ### Developer Experience - ESLint now catches missing permission guards during development - Explicit guard markers make permission requirements clear in code review - Comprehensive test coverage for new permission logic ## Testing - ✅ All TypeScript type checks pass - ✅ ESLint validation passes - ✅ New permission guards properly enforced - ✅ Frontend UI displays new permissions correctly ## Migration Notes Existing workspaces will need to assign the new permissions to roles as needed. By default, all new permissions are set to `false` for non-admin roles.
This commit is contained in:
+6
-1
@@ -20,7 +20,7 @@ export function useCachedMetadata(config: CacheMetadataPluginConfig): Plugin {
|
||||
request,
|
||||
}: {
|
||||
operationName: string;
|
||||
request: Pick<Request, 'workspace' | 'locale' | 'body'>;
|
||||
request: Pick<Request, 'workspace' | 'locale' | 'body' | 'userWorkspaceId'>;
|
||||
}) => {
|
||||
const workspace = request.workspace;
|
||||
|
||||
@@ -34,6 +34,11 @@ export function useCachedMetadata(config: CacheMetadataPluginConfig): Plugin {
|
||||
.update(request.body.query)
|
||||
.digest('hex');
|
||||
|
||||
// For FindAllCoreViews, use user-specific cache key since visibility filtering is user-dependent
|
||||
if (operationName === 'FindAllCoreViews') {
|
||||
return `graphql:operations:${operationName}:${workspace.id}:${workspaceMetadataVersion}:${request.userWorkspaceId}:${queryHash}`;
|
||||
}
|
||||
|
||||
return `graphql:operations:${operationName}:${workspace.id}:${workspaceMetadataVersion}:${locale}:${queryHash}`;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user