При загрузке приложения у меня есть объект из бэкэнда со страницами, к которым у определенного пользователя есть доступ. Страницы без доступа не отображаются.
{
'User Management': {
Users: {
name: 'Users Page',
},
Groups: {
name: 'Groups Page',
},
},
'Data Management': {
Schemas: {
name: 'Schemas Page',
},
Lists: {
name: 'Lists Page',
},
},
};
Я создал компонент PrivateRoute
и добавил в него реквизит checkPermissions
, чтобы другие страницы не запускались.
<PrivateRoute
path={Routes.USER_MANAGEMENT.USERS}
component={UserListView}
exact
name="Users"
checkPermissions
/>
Способ проверки заключается в том, что если имя маршрута находится внутри объекта, то пользователь получает доступ к странице.
export const checkAccessPermission = (pages, routeName) =>
deepFindKey(pages, routeName).length;
Не очень этим горжусьметод, но я не могу найти другой способ сделать это.
Другая проблема состоит в том, что страницы, которые находятся под User Management
, были созданы как отдельные маршруты внутри отдельных компонентов, в то время как страницы внутри Data Management
были созданыпо тому же маршруту и тому же компоненту.
<PrivateRoute
path={`${Routes.DATA_MANAGEMENT}/:model/:id/:submodel`}
component={DataModelListView}
exact
/>
Так что это означает, что я не могу использовать свой предыдущий метод с name
prop. Я мог бы сделать рефакторинг страниц User Management
частью одного и того же компонента, но это может занять несколько дополнительных дней. Есть ли лучший способ обрабатывать разрешения для одной страницы, независимо от того, как настроены маршруты?