Вопрос

Что было бы идеальной структурой для пользователей> Разрешения объектов.

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

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

Group 1
    Group 2
    Group 3
    Group 4
Group 5
   Group 6
Group 7
   Group 8
       Group 9
       Group 10

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

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

Моя текущая мысль - иметь таблицу пользователей, а затем таблица разрешений с столбцами, такими как:

permission_id (int) PRIMARY_KEY
user_id (int) INDEX
object_id (int) INDEX
type (varchar) INDEX
admin (bool)
read (bool)
write (bool)
edit (bool)
delete (bool)

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

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

Итак, как вопрос, я должен использовать вышеупомянутую структуру? Или кто-то может указать мне в направлении лучшего?


РЕДАКТИРОВАТЬ

Альтернатива - создать таблицу разрешений для каждого типа объекта.

Это было полезно?

Решение

Предлагаю вам добавить «Last_Update» Timestamp и столбца «Last_Updated_by_by_user», поэтому у вас есть надежда на отслеживание изменений в этой таблице в вашей рабочей системе.

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

Будьте осторожны с «должны быстро масштабироваться». Трудно догадаться без реального производства реального производства, что на самом деле потребности масштабированной системы.

Кроме того, будьте осторожны, чтобы не преодолеть систему разрешений, потому что чрезмерно сложная система будет трудно проверить и, следовательно, легче трещина. Простая система будет намного проще для рефактора для масштабирования, чем более сложный.

Кажется, ваша схема относится к пользователям к объектам. Хотите, чтобы ваш основной ключ и ваш уникальный индекс быть (user_id, object_id)? То есть вы хотите, чтобы каждый пользователь имел нулю или одну запись разрешения для каждого объекта? Если это так, используйте первичный ключ для обеспечения того, чтобы обеспечить его, а не использовать ключ Surrogate Permission_id.

Для ваших объектов, которые существуют в иерархиях, вы должны сделать один из двух вариантов Systemwide:

  1. Грант объекту с подборщиками неявно предоставляет доступ только к объекту или ...

  2. Это также предоставляет доступ ко всем субкам.

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

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

Я думаю, что первый выбор, вероятно, превосходит. Я предлагаю этот макет стола:

user_id (int)
object_id (int)
type (varchar)  (not sure what you have this column for)
admin (bool)
read (bool)
write (bool)
edit (bool)
grant (bool)
delete (bool)
last_update (timestamp)
last_updated_by_user_id (int)
primary key = user_id, object_id.

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

user_id (int)
object_id (int)
permission_enum (admin/read/write/edit/grant/delete)
type (varchar)  (not sure what you have this column for)
last_update (timestamp)
last_updated_by_user_id (int)
primary key = user_id, object_id, permission_enum
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top