Итак, я выяснил, что есть альтернативный и простой подход для реализации доступа на основе ролей (RBAC) во внешнем интерфейсе.
В своем состоянии хранилища резервов создайте объект с именем permissions (или можете называть его как угодно) следующим образом:
const InitialState = {
permissions: {}
};
Затем при входе в систему настройте права доступа, которые вы хотите предоставить следующим образом:
InitialState['permissions'] ={
canViewProfile: (role!=='visitor'),
canDeleteUser: (role === 'coordinator' || role === 'admin')
// Add more permissions as you like
}
В первом разрешении вы говорите, что можете просматривать профиль, если вы не являетесь посетителем.
Во втором разрешении вы говорите, что можете удалить пользователя, только если вы являетесь администратором или координатором.
и эти переменные будут иметь значение true или false в зависимости от роли вошедшего в систему пользователя. Таким образом, в вашем состоянии магазина у вас будет объект разрешений с ключами, которые представляют разрешения, и их значение будет определяться исходя из вашей роли.
Затем в вашем компоненте используйте состояние хранилища, чтобы получить объект разрешения. Вы можете сделать это используя connect как:
const mapStateToProps = (state) => {
permissions : state.permissions
}
и затем подключите эти реквизиты к вашему Компоненту, как:
export default connect(mapStateToProps,null)(ComponentName);
Затем вы можете использовать эти реквизиты внутри вашего компонента на любом конкретном элементе, который вы хотите показать условно следующим образом:
{(this.props.permissions.canDeleteUser) && <button onClick={this.deleteUser}>Delete User</button>}
Приведенный выше код гарантирует, что кнопка удаления пользователя будет отображаться только в том случае, если у вас есть разрешения на удаление пользователя, т. Е. В объекте разрешений состояния хранилища, значение canDeleteUser равно true.
Вот и все, вы применили доступ на основе ролей. Вы можете использовать этот подход, так как он легко масштабируется и изменчив, поскольку у вас будут все разрешения в соответствии с ролями в одном месте.
Надеюсь, это поможет! Если я что-то упустил, пожалуйста, помогите мне в комментариях. : -)