Подтвердить что ты не робот

Создайте лучшую систему контроля доступа

Я занимаюсь строительством системы контроля доступа как части веб-структуры, которую я разрабатываю. Я хочу сделать его супер гибким и потрясающим. Можете ли вы помочь мне, предоставив информацию и проницательность в моем дизайне? Вот моя работа до сих пор (мои конкретные вопросы внизу):

Пользователи

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

Accounts

  • Учетные записи представляют один или несколько пользователей.
  • Каждый пользователь может иметь определенные разрешения или роли для учетной записи (например, владельца учетной записи или "может добавлять нового пользователя" ).
  • Все учетные записи привязаны к типу учетной записи

Типы учетных записей

  • Типы учетных записей имеют ноль или несколько ролей типа учетной записи.
  • Типы учетных записей имеют ноль или многие функции типа учетной записи.

Роли учетной записи

  • Например, "Владелец", "Администратор", "Пользователь питания", "Гость" и т.д.
  • Роли учетной записи - это набор разрешений типа учетной записи.

Разрешения типа учетной записи

  • Разрешения типа учетной записи - это конкретные действия в системе, которые логика приложения будет проверять с помощью
  • Они могут ссылаться на родителя, поэтому они могут быть иерархически сгруппированы
  • т.д.:
    • "Управление пользователями"
      • "Добавить пользователя"
      • "Удалить пользователя"
  • Эти разрешения могут быть специально для функции типа учетной записи.

Функции типа учетной записи

  • Функции учетной записи могут быть активированы в учетной записи, чтобы предоставить ей больше разрешений
  • Например, "Стандартная учетная запись" или "Премиум-аккаунт"
  • Эти функции, если они активированы в учетной записи, предоставят владельцу учетной записи больший доступ к системе.
  • Они отслеживаются, когда они активируются или деактивируются и могут быть выставлены счет периодически или по запросу.

Вопросы

Каков наилучший способ проверки логики приложения против действия пользователя? Я думал о том, чтобы хранить все разрешения пользователя в объекте для своего сеанса (для чего потребуется разрешение для входа/входа в систему для обновления разрешений, к которым я не являюсь поклонником, - каких-либо идей по управлению разрешениями в реальном времени?):

{
  "All Permissions": {
    "User Management": {
        "Add User",
        "Delete User"
    },
    "Premium Account": {
        "Download Files",
        "Upload Files"
    },
  }
}

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

Permission::require('Add User');

Если объявленные разрешения не были включены в объект разрешений пользователей, запрос будет терпеть неудачу. Тем не менее, это кажется очень напряженным для каждого действия пользователя. Кроме того, что, если в другом подмножестве разрешений есть строка "Добавить пользователя"?

Заранее благодарим за помощь!

4b9b3361

Ответ 1

Рассматривая разрешения вашего типа учетной записи, кажется, что у вас есть дизайн системы стиля управления доступом (ACL).

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

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

Кроме того, это было сделано раньше (хотя, как ни странно, для реализаций, на которые мы можем обратить внимание) очень мало; возможно, посмотрите Rhino Security. Исходная ссылка http://ayende.com/Blog/category/548.aspx нарушена, поэтому сохраняйте ссылку на интернет-архив для справки.

Ответ 2

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

READ    USER1
READ    USER2
WRITE   USER2
READ    USER3
WRITE   USER3
DELETE  USER3

В качестве альтернативы вы можете указать "группу" вместо имени пользователя.

READ    SUBSCRIBER
READ    EDITOR
READ    ADMIN
WRITE   EDITOR
WRITE   ADMIN
DELETE  ADMIN
USER1   SUBSCRIBER
USER2   EDITOR
USER3   ADMIN

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

Ответ 3

Я бы посмотрел на систему Java для разрешений:

http://download.oracle.com/javase/6/docs/api/java/security/Permission.html

Он использует "логику импликации"; то есть объект разрешения - это то, что решает, разрешено ли данное действие (то есть, являются ли разрешения "подразумевает" доступ к ресурсу). Я также проверил бы BasicPermission, поскольку у него есть довольно прямолинейная спецификация пространства имен для разрешений. В вашем примере это будет (после номенклатуры CRUD)

  • user.create
  • user.delete
  • file.read
  • file.create

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

boolean isAuthorized = user.permissions.implies(requestResource.permission); (подразумевается стандартная инкапсуляция)

чтобы определить, разрешен ли пользователю доступ.

Ответ 4

Вот мой два смысла, за что он стоит.

Сначала я бы сказал, когда вы начнете дизайн этого, подумайте о ООП и о том, как он будет применяться к объектам внутри системы. Пользователи, User_Role, Roles, Role_Permissions, Accounts, Account_Types, Account_Type_Features и т.д.

ПОЛЬЗОВАТЕЛЕЙ: - Должно быть разрешено использовать OpenID, поскольку он набирает силу - Возможность выбора между идентификатором или UUID для переносимости базы данных

РОЛЬ ПОЛЬЗОВАТЕЛЯ: (а не РОЛИКИ ТИПА АККАУНТА) Я бы рекомендовал вам быть очень конкретным. Например, где вы рисуете линию между пользователем власти и администратором? Какая разница между ADMIN и OWNER? Пока они четко определены (а не размыты), тогда это сработает. Если у вас есть какой-либо вопрос среди вашей пользовательской базы, довольно скоро у вас будет свернутый набор ролей и разрешений. Я бы сдержал это до минимума, чтобы сохранить чистоту. Пользователи выяснят, как работать с тем, что им дано. Кроме того, я бы изменил это на ROLES USER TYPE. Роли должны применяться к пользователю, а не к учетной записи.

РАЗРЕШЕНИЯ ПОЛЬЗОВАТЕЛЯ: (а не РАЗРЕШЕНИЯ ТИПА АККАУНТА) Это должно быть изменено на ROLE PERMISSIONS. Разрешения распространяются на роль пользователей, а не на учетную запись или пользователя. По моему опыту, более ясный дизайн, тем меньше места для путаницы по дороге. Также избегайте ACL, как чума. Сделайте это простым отношения "один-к-одному". Мне еще предстоит найти причину для внедрения ACL для любой веб-системы. Другие системы, основанные на разрешении, намного легче понимать, поддерживать и использовать. Нет никакого смысла в усложнении вопроса.

ОСОБЕННОСТИ ТИПА АККАУНТА: Будьте осторожны, чтобы не заслонять возможности типа учетной записи и тип учетной записи. Ваша первая точка маркера использует разрешения на слово. Измените его на функции. Тип учетной записи активирует более продвинутые/премиальные функции (а не разрешения).

Управление разрешениями: Для приложения без состояния, запущенного в Интернете, сеансы - это путь. Преимущество заключается в том, что нет никаких обращений к БД постоянно проверьте, разрешен ли пользователь.

Permission::require() должен следовать тем же параметрам, что и Session. Это предотвратит совпадение другого подмножества разрешений. Таким образом, вызов будет выглядеть как Permission::require('User Management', 'Add User'); Это означает, что он будет искать $_SESSION['All Permissions']['User Management']['Add User'] Это предотвратит двусмысленность.

Помните, что SIMPLE ЛУЧШЕ.

Ответ 5

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

http://vimeo.com/2723800

Ответ 6

Я советую вам изучить Zend_Acl из Zend Framework. Как и большинство пакетов Zend, он имеет крутую кривую обучения. Но когда вы полностью понимаете ресурс, действие, отношения ролей, он становится верным универсальным и мощным фундаментом для ваших собственных реализаций ACL.

Проведите некоторое исследование существующих пакетов и шаблонов ACL.

Ответ 7

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

Ответ 8

Семантика, которую вы используете, немного запутанна. Например, типы учетных записей "Владелец", "Администратор", "Власть пользователя", "Гость" больше напоминают "Типы пользователей".

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