Роли работают, присваивая значение тому, что может сделать пользователь. Роли не меняются, но поведение этих ролей меняется. Ультра-динамические решения, как правило, излишни.
Так что, возможно, у вас есть следующие роли
- Супер Админ
- Поддержка
- Администратор
Вы можете выполнять различные действия (это будет зависеть от вашей системы)
- Посмотреть
- Редактировать
- Утверждение
и т. Д.
- Super Admin [Просмотр, редактирование, утверждение]
- Поддержка [Просмотр]
- Admin [Просмотр, редактирование]
Динамическая часть входит в назначение действий. Делая вещи таким образом, вам не важно, в какой роли кто-то играет, а какие действия они совершают. Действия являются динамическим аспектом в этих отношениях. Когда будет сделан запрос, вы будете использовать Роль пользователя, чтобы получить назначенные Действия для этой роли (База данных Управляется, чтобы сделать изменяемой)
Включение этого в структуру вашей базы данных как « Роль имеет много действий » означает, что если в будущем все изменится, вам нужно будет обновить отношения в базе данных, но не код ,
Структура базы данных может выглядеть примерно так, в зависимости от ваших потребностей.
- UserRole [ID, UserName, RoleID] (Если пользователю назначено более одной роли, он наследует все действия, которые могут быть дублированы, и поэтому выбрал DISTINCT или предотвращает этот сценарий, но я считаю, что первый обеспечивает большую гибкость без сложности и ограничений ПРИМЕЧАНИЕ. Таблица UserRole может быть дополнительно денормализована, чтобы сделать уникальными имена пользователей.)
- Роль [ID, имя]
- Действие [ID, имя]
- RoleAction [ID, RoleID, ActionID] (ограничение уникального ключа для RoleID и ActionID)
Когда сделан запрос, вы идентифицируете пользователя и т. Д. Имя пользователя , затем тренировки, в которых Роли (ей) , в которых они находятся запрашивая RoleAction и тем самым загружая связанные с ним действия
Я бы использовал перечисления для ваших значений действий и ролей. Это облегчает работу. Чтобы база данных и код находились в приемнике, убедитесь, что вы написали модульный тест, сопоставив значения базы данных со значениями перечисления.