Контроль доступа на уровне объекта в иерархической схеме данных

У меня есть требование для авторизации на уровне сущности, которое прямо над моей головой. Я надеюсь получить некоторое руководство по этой структуре разрешений, как я мог бы реализовать ее в.NET 4.5 и, если есть способы, я мог бы улучшить ее.

Здесь это идет:


У меня есть набор данных, структурированных следующим образом:

введите описание изображения здесь

куда

  • Fleet это коллекция ноль или более Cars,
  • Fleet может содержать другие Fleets

Флот может быть позже реорганизован и перемещен для организационных целей.

У меня есть несколько ролей с разрешениями в системе, которые относятся к этим объектам:

  • Владелец: может добавлять или удалять автомобили из автопарка
  • Менеджер: назначает водителей на автомобили
  • Водитель: разрешено просто водить машину
  • Механик: разрешено чинить машину

Логика авторизации позволяет User в системе будет предоставлен доступ к любому Fleet или Car с одной или несколькими ролями.

Вот несколько сценариев, которые помогут объяснить:

  1. Если я предоставлю User Джим доступ к Fleet № 5 с ролью DriverЕму разрешено управлять любым автомобилем под парком № 2. Полученные разрешения позволяют ему водить машины № 4, 5, 6
  2. Если я предоставлю пользователю Maura доступ к Car #1 Как механик, получившиеся разрешения позволяют ей починить только машину № 1.
  3. Если я предоставлю пользователю Сару доступ к флоту № 2 с ролями Owner а также MechanicЕй разрешено добавлять и удалять машины для парков № 2, 4, 5 И ей разрешается ремонтировать машины № 1, 2, 3, 4, 5, 6.
  4. Если я предоставлю пользователю Джереми доступ к флоту № 1 в качестве Owner И к флоту № 6 в качестве DriverПолученные разрешения позволяют ему добавлять и удалять автомобили для всех автопарков И управлять автомобилями № 7, 8. Он не может управлять любым другим автомобилем, кроме № 7 и 8.

Каков хороший подход к авторизации на уровне объекта?

Если это имеет значение, мы используем.NET 4.5.1 с EF6 Code First, построенный на основе ASP.net Boilerplate.

1 ответ

Детализированная авторизация, которую вы хотите реализовать, напоминает мне об объектах контроля доступа (ACO - что-то, что нужно) и объектах запроса доступа (ARO - что-то, что хочет чего-то) в описании CakePHP Access Control List (ACL) с некоторыми вариациями:

Вот в двух словах:

У вас есть ACO (автопарки и автомобили), которые будут запрашиваться ARO (владелец, менеджер, водитель, механик). Если вы хотите узнать, имеет ли запрашивающая сторона доступ к объекту, вы найдете путь к этому объекту (Can John access "Car #3"?: найти путь "Car #3" от root: Fleet #1 > Fleet #2 > Car #3), затем назначьте разрешение по умолчанию "Запретить" каждому узлу, но переключите его на "Разрешить", если этот узел находится в списке разрешенных узлов запрашивающей стороны. Если последний узел заканчивается "Разрешить", тогда, ну... разрешить, иначе запретить.

Понимание логики в первую очередь является ключевым. Реализация на любом языке занимает второе место.

Я надеюсь, что это указывает вам в правильном направлении.

Ура,