Comments 6
function isSatisfied(requirement, credentials) {
if (...) {
return false;
}
return true;
}
Куда безопаснее сделать наоборот
Не стоит оформлять HOC вот так
на порядок лучше
вашу версию нельзя компоновать через compose
function protect(requirement, WrappedComponent)
на порядок лучше
const protect = requirement => WrappedComponet => props => { ... }
вашу версию нельзя компоновать через compose
import { compose } from 'redux';
import { connect } from 'react-redux';
const enhance = compose(
protect({ ... }),
connect(...),
);
export default enhance(App);
У меня это, например, все не по коду размазано, а в роутере. Я использую react-router, connected-router и redux-auth-wrapper.
Допустим у меня есть массив роутов в App.jsx:
Далее в лейауте:
Соотвественно в файле с правилами для роутов:
Где userHasItemsListReadSelector — это селектор декодированных уровней доступа из jwt токена. Конечно же, его можно использовать и в jsx.
Допустим у меня есть массив роутов в App.jsx:
[{
path: routes.ITEMS_LIST,
component: userHasItemsListRead(ItemsList),
}].map(r => ({ ...r, component: userIsAuthenticatedRedirect(r.component) }))
Далее в лейауте:
<Switch>
{authenticatedRoutes.map(r => (
<Route key={r.path} path={r.path} component={r.component} />
))}
<Route path={routes.LOGIN} component={userIsNotAuthenticatedRedirect(Login)} />
<Redirect from={routes.ROOT} exact to={routes.HOME_PAGE} />
<Route component={NotFoundPage} />
</Switch>
Соотвественно в файле с правилами для роутов:
export const userHasItemsListRead= connectedRouterRedirect({
...unauthenticatedRedirect,
authenticatedSelector: userHasItemsListReadSelector,
wrapperDisplayName: 'HasItemsListRead',
})
Где userHasItemsListReadSelector — это селектор декодированных уровней доступа из jwt токена. Конечно же, его можно использовать и в jsx.
Sign up to leave a comment.
Подход к реализации RBAC в ReactJS