Разработка класса доступа пользователя / разрешений - PullRequest
6 голосов
/ 18 апреля 2011

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

Например:

  • «Сотрудник» может ответить на назначенные ему билеты в службу поддержки.

  • «Менеджер» может управлять всеми сотрудниками и поддерживать билеты в своей команде, включая просмотр билетов конкретного сотрудника.

  • Администратор может управлять всеми менеджерами, сотрудниками и тикетами во всех командах, а также некоторыми другими основными функциями.

Кроме того, на некоторых страницах отображаются некоторые дополнительные поля, если текущий пользователь является администратором или менеджером. (Например, ссылки для удаления / пометки вещей). Они не будут показаны сотрудникам.

Я хочу создать одну модель «Разрешения», которая будет обрабатывать логику для:

  • Определение, может ли пользователь получить доступ к текущей странице или нет.

  • Определение того, должна ли отображаться определенная часть страницы или нет. (Например, специальные ссылки для редактирования / удаления должны показываться только администраторам и менеджерам).

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

Ответы [ 3 ]

3 голосов
/ 21 апреля 2011

Мой подход к этой проблеме с точки зрения базы данных состоит в том, чтобы иметь таблицу пользователей, которая содержит список пользователей, таблицу ролей для списка ролей, например: сотрудник, менеджер, администратор;и таблица разрешений, в которой хранятся все значения каждого действия / функции, доступные в системе, и их разрешения для конкретной роли, например, скажем, для администратора, значения для действий / функций, таких как создание, редактирование, удаление, просмотр, являются истинными.Отношения можно увидеть ниже, тогда как (N) ---- (N) является отношением «многие ко многим».

Пользователи (N) ------- (N) Роли (N)-------- (N) разрешение

3 голосов
/ 18 апреля 2011

Я подошел к этой проблеме, когда она возникла, чтобы дать каждому действующему действию или части информации, которая может быть показана, свою собственную Permission.Каждый User имеет коллекцию Permissions.Исходя из этого, вы можете добавить другие слои структуры, чтобы помочь управлять огромным количеством разрешений, таких как иерархии или категории разрешений.

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

Подход PermissionManager имеет то преимущество, что ваши приложения не должны зависеть от User, так что вы можете использовать другой PermissionManager, который всегда возвращает False, если нет соответствующих разрешений, или True, если все разрешения подходят.

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

0 голосов
/ 18 апреля 2011

У меня сложилось впечатление, что вам потребуется использовать роли, например, сотрудник, менеджер и админ. Таким образом, таблица ролей с этим подойдет. Затем для конкретных действий / разрешений вы должны будете использовать логику ветвления, например, для сотрудника, которого вы будете иметь. if User.IsInRole ("employee") // вставляем логику для работы с билетами поддержки клиентов иначе если User.IsInRole ("менеджер") // вставить логику, чтобы справиться с обязанностями менеджера

и, наконец, логика для решения административных обязанностей

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

...