Skip to content

Commit b06972b

Browse files
committed
Fix ResourceMenuItem should not render in case of access control error
1 parent 92ff6ab commit b06972b

File tree

3 files changed

+39
-8
lines changed

3 files changed

+39
-8
lines changed

packages/ra-ui-materialui/src/layout/ResourceMenuItem.spec.tsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,25 @@ describe('ResourceMenuItem', () => {
1919
await screen.findByText('resources.posts.name');
2020
expect(screen.queryByText('resources.users.name')).toBeNull();
2121
});
22+
it('should not render when authProvider.canAccess throws', async () => {
23+
render(
24+
<AccessControl
25+
authProvider={
26+
{
27+
checkAuth: () => Promise.resolve(),
28+
canAccess: ({ resource }) =>
29+
resource === 'posts'
30+
? Promise.resolve(true)
31+
: Promise.reject(
32+
new Error('access control error')
33+
),
34+
} as any
35+
}
36+
/>
37+
);
38+
await screen.findByText('resources.posts.name');
39+
expect(screen.queryByText('resources.users.name')).toBeNull();
40+
});
2241
it('should not render when authProvider.canAccess returns false with a Function as <Admin> child', async () => {
2342
render(<AccessControlInsideAdminChildFunction />);
2443
await screen.findByText('resources.posts.name');

packages/ra-ui-materialui/src/layout/ResourceMenuItem.stories.tsx

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
import * as React from 'react';
2-
import { Resource, testDataProvider, TestMemoryRouter } from 'ra-core';
2+
import {
3+
AuthProvider,
4+
Resource,
5+
testDataProvider,
6+
TestMemoryRouter,
7+
} from 'ra-core';
38
import { Menu } from './Menu';
49
import { Layout, LayoutProps } from './Layout';
510
import { AdminContext } from '../AdminContext';
@@ -100,12 +105,13 @@ export const AccessControlInsideAdminChildFunction = () => (
100105
</TestMemoryRouter>
101106
);
102107

103-
export const AccessControl = () => (
108+
export const AccessControl = ({
109+
authProvider = authProviderForAccessControl,
110+
}: {
111+
authProvider?: AuthProvider;
112+
}) => (
104113
<TestMemoryRouter>
105-
<AdminContext
106-
dataProvider={dataProvider}
107-
authProvider={authProviderForAccessControl}
108-
>
114+
<AdminContext dataProvider={dataProvider} authProvider={authProvider}>
109115
<AdminUI layout={CustomLayout}>
110116
<Resource name="users" list={<p>The users page</p>} />
111117
<Resource

packages/ra-ui-materialui/src/layout/ResourceMenuItem.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,19 @@ import { MenuItemLink } from './MenuItemLink';
1313

1414
export const ResourceMenuItem = ({ name }: { name: string }) => {
1515
const resources = useResourceDefinitions();
16-
const { canAccess, isPending } = useCanAccess({
16+
const { canAccess, error, isPending } = useCanAccess({
1717
action: 'list',
1818
resource: name,
1919
});
2020
const getResourceLabel = useGetResourceLabel();
2121
const createPath = useCreatePath();
22-
if (!resources || !resources[name] || isPending || canAccess === false)
22+
if (
23+
!resources ||
24+
!resources[name] ||
25+
isPending ||
26+
canAccess === false ||
27+
error != null
28+
)
2329
return null;
2430
return (
2531
<MenuItemLink

0 commit comments

Comments
 (0)