diff --git a/packages/ra-core/src/core/useResourceDefinition.ts b/packages/ra-core/src/core/useResourceDefinition.ts
index 416d84cf5eb..c204ae1c869 100644
--- a/packages/ra-core/src/core/useResourceDefinition.ts
+++ b/packages/ra-core/src/core/useResourceDefinition.ts
@@ -1,14 +1,39 @@
 import { useSelector } from 'react-redux';
+import merge from 'lodash/merge';
 import { getResources } from '../reducer';
 import { ResourceDefinition } from '../types';
 import { useResourceContext } from './useResourceContext';
+import { useMemo } from 'react';
 
 /**
  * Hook which returns the definition of the requested resource
  */
-export const useResourceDefinition = (props): ResourceDefinition => {
+export const useResourceDefinition = (
+    props: UseResourceDefinitionOptions
+): ResourceDefinition => {
     const resource = useResourceContext(props);
     const resources = useSelector(getResources);
+    const { hasCreate, hasEdit, hasList, hasShow } = props;
 
-    return resources.find(r => r?.name === resource) || props;
+    const definition = useMemo(() => {
+        const definitionFromRedux = resources.find(r => r?.name === resource);
+        return merge({}, definitionFromRedux, {
+            hasCreate,
+            hasEdit,
+            hasList,
+            hasShow,
+        });
+    }, [resource, resources, hasCreate, hasEdit, hasList, hasShow]);
+
+    return definition;
 };
+
+export interface UseResourceDefinitionOptions {
+    readonly resource?: string;
+    readonly options?: any;
+    readonly hasList?: boolean;
+    readonly hasEdit?: boolean;
+    readonly hasShow?: boolean;
+    readonly hasCreate?: boolean;
+    readonly icon?: any;
+}