Контроль доступа на уровне объекта в иерархической схеме данных
У меня есть требование для авторизации на уровне сущности, которое прямо над моей головой. Я надеюсь получить некоторое руководство по этой структуре разрешений, как я мог бы реализовать ее в.NET 4.5 и, если есть способы, я мог бы улучшить ее.
Здесь это идет:
У меня есть набор данных, структурированных следующим образом:
куда
Fleet
это коллекция ноль или болееCars
,Fleet
может содержать другиеFleets
Флот может быть позже реорганизован и перемещен для организационных целей.
У меня есть несколько ролей с разрешениями в системе, которые относятся к этим объектам:
- Владелец: может добавлять или удалять автомобили из автопарка
- Менеджер: назначает водителей на автомобили
- Водитель: разрешено просто водить машину
- Механик: разрешено чинить машину
Логика авторизации позволяет User
в системе будет предоставлен доступ к любому Fleet
или Car
с одной или несколькими ролями.
Вот несколько сценариев, которые помогут объяснить:
- Если я предоставлю
User
Джим доступ кFleet
№ 5 с рольюDriver
Ему разрешено управлять любым автомобилем под парком № 2. Полученные разрешения позволяют ему водить машины № 4, 5, 6 - Если я предоставлю пользователю Maura доступ к
Car #1
Как механик, получившиеся разрешения позволяют ей починить только машину № 1. - Если я предоставлю пользователю Сару доступ к флоту № 2 с ролями
Owner
а такжеMechanic
Ей разрешено добавлять и удалять машины для парков № 2, 4, 5 И ей разрешается ремонтировать машины № 1, 2, 3, 4, 5, 6. - Если я предоставлю пользователю Джереми доступ к флоту № 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
), затем назначьте разрешение по умолчанию "Запретить" каждому узлу, но переключите его на "Разрешить", если этот узел находится в списке разрешенных узлов запрашивающей стороны. Если последний узел заканчивается "Разрешить", тогда, ну... разрешить, иначе запретить.
Понимание логики в первую очередь является ключевым. Реализация на любом языке занимает второе место.
Я надеюсь, что это указывает вам в правильном направлении.
Ура,