Какова базовая модель для создания базы данных с пользователями и группами?

9

Я пытаюсь найти лучший способ для базовой системы безопасности для веб-сайта. Я знаю, что я хочу, чтобы пользователи и группы.

Я думал, что у меня будет:

user_table
user_id
user_name
...

group_type
group_id
group_name
parent_id
...

group_table
id
user_id
group_id

Первый - это пользователь, второй - это группа, а третий - промежуточная таблица, которая связывает их. У одного пользователя есть много групп.

Это звучит нормально?

Джонни
источник
Кроме имен. Ваша GROUP_TYPEтаблица должна быть названа GROUPили иметь что-то похожее, а ваша GROUP_TABLEдолжна ссылаться как на пользователей, так и на группы, поскольку это то, что она связывает.
Адам Муш
@adam не делает ли group_table это с user_id и group_id?
Джонни
4
@AdamMusch Не должно называться GROUP, так как это зарезервированное слово. Таблицы и столбцы никогда не должны называться в честь зарезервированных слов
Philᵀᴹ
1
@ Фил согласился. Вы можете также назвать таблицу SELECTи поле, FROMчтобы у вас был запрос типаSELECT [FROM] FROM [SELECT]
JNK
2
Попробуйте назвать базовые объекты как «app_user» и «app_role»
ConcernedOfTunbridgeWells

Ответы:

17

Традиционный способ моделирования это использование шаблона под названием Role-Based Security .

Идея состоит не только в том, чтобы иметь группы пользователей, но также и группы прав доступа. Вот как выглядит шаблон:

Ролевая безопасность ERD

Обратите внимание, что вы хотите избежать зарезервированных слов для имен таблиц, поэтому не называйте ваши таблицы точно так, как показано на диаграмме.

Это работает так, что ваши группы или роли имеют не только список назначенных им пользователей, но и список назначенных им разрешений. Это позволяет вам следить за тем, кто может что-то делать, но также и за тем, что они могут делать, если вы последуете за мной.

Джоэл Браун
источник
Но что, если у моего пользователя есть какая-то роль, например, менеджер или что-то еще, и по какой-то причине одному и тому же пользователю также нужно одно конкретное разрешение (которого нет ни в этой роли, ни в какой-либо другой роли в одиночку)?
Леви
@levi - если это произойдет, то один из способов справиться с этим - создать специальную роль, такую ​​как «Специальные разрешения Боба» , что является чем-то вроде клуджа, но это решает проблему, пока у вас не слишком много исключений, таких как это. Возможно, что то, что вы считаете индивидуальным исключением, на самом деле может быть тонкой новой ролью, которую вы не рассматривали. Что происходит, когда Боб уходит? Замена Боба также нуждается в этом исключительном разрешении? Если это так, то у вас есть роль с одним участником, а не исключение.
Джоэл Браун
@levi - Другая возможность заключается в том, что вам действительно нужно иметь сочетание прав личности и ролей. В этом случае ваша ROLEтаблица может быть подразделена на отдельные типы и типы групп , где тип группы имеет ноль для многих членов, а отдельный тип имеет ровно один элемент. Как вы применяете эти правила кардинальности, зависит от вас. Это может быть сделано декларативно в вашей схеме базы данных, в этом случае вам нужно немного изменить изображенную схему. Или вы можете использовать логику приложения, и в этом случае ваша схема по-прежнему выглядит так, как я изобразил выше.
Джоэл Браун