Управление доступом на уровне сущности в иерархической схеме данных

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

Вот оно:


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

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

Где

  • Fleet - это набор из нуля или более Cars.
  • Fleet может содержать другие Fleets

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

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

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

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

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

  1. Если я предоставлю User Джиму доступ к Fleet №5 с ролью Driver, ему будет разрешено управлять любым автомобилем в парке №2. Полученные разрешения позволяют ему управлять машинами №4, 5, 6.
  2. Если я предоставлю пользователю Маура доступ к 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 - что-то, что чего-то хочет) в Описание списка управления доступом (ACL) CakePHP с некоторыми вариациями:

Вот вкратце:

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

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

Надеюсь, это укажет вам правильное направление.

Ваше здоровье,

person JorgeObregon    schedule 06.03.2017