docker
Новичок
Модель расчета динамических ролей(рантайм опредение связей)
Планируется оптимальная архитектура разграничения прав для некоторого подобия ERP-системы. А именно такой специфический security-level, который был бы универсальным для различного рода объектов системы и который сам бы проверял все права, вытекающие как из статических, так и динамических ролей пользователя(свя).
Статическая роль – то что принято считать: роль, которая обеспечивает для ее пользователей повсеместный доступ для объектов определенного класса ВНЕ зависимости от свойств этих объектов. Например, роль «Администратор заказов» — значит то, что пользователи этой роли имеют доступ к любому объекту заказ.
Динамическая роль – здесь доступ к объекту рассчитывается исходя из свойств самих объектов(рантайм определение связей между объектами-субъектами). Например: роль «Ответственный за заказы» — будет иметь доступ не ко всем заказам, а только к тем, у которых он поставлен ответственным, т.е. к тем объектам-заказам у которых в свойстве «ответственный» указан id этого пользователя.
Обычно права вот этих динамических ролей разруливаются в различного рода менеджерах объектов, т.е. в дополнительном слое, вышестоящем над DAL-ом и security-level. Т.е. для расчета доступа к объекту(ам) сначала стандартным образом security-level проверяет статичные роли, если там нет доступа, то делает запросы к БД для выяснения того, должен ли у этого пользователя быть доступ к данному объекту(ам) на основании каких-либо динамических ролей. Например для того же «Ответственного за заказы» — это будет дополнительный запрос в БД, который даст нам: совпадает ли id ответственного у данного заказа с id текущего пользователя.
Так вот, это же получается то, что вот эти вот права динамических ролей, их расчет мы выносим из security-level и уже в другом, более высокоуровневом слое, вручную проверяем дополнительными запросами к БД.
И вот вопрос в том, как спланировать архитектуру этого security-level, чтобы это все инкапсулировать в нем. Т.е. мы говорим ему просто: «От имени текущего пользователя – выбрать объекты такого-то класса». Он сам смотрит сначала статические права, потом каким-то образом проверяет нет ли у пользователя доступа к объекту по каким-то его динамическим ролям – и выдает результат. Например, для админа заказов – этот запрос должен будет выдать все объекты-заказы, для Ответсвенных за заказы – все заказы, у которых ответственный == текущему пользователю и т.д.
Вся проблема в том, как построить такую архитектуру, которая позволит легко и универсально добавлять, удалять динамические роли вместе со стратегиями их вычисления в этот security level.
Можно например, иметь в базе справочник динамических ролей и к каждому id этой роли жестко привязать код правила который будет определять доступность объектов по этой роли.
Как еще можно разрулить такую ситуацию? Не хотелось бы изобретать велосипед, т.к. подозреваю, что я далеко не первый кто над этим задумался и пытается реализовать. Кто как реализовал подобные ситуции? Где почитать о реализации таких моделей безопасности? Куда копать ?
Планируется оптимальная архитектура разграничения прав для некоторого подобия ERP-системы. А именно такой специфический security-level, который был бы универсальным для различного рода объектов системы и который сам бы проверял все права, вытекающие как из статических, так и динамических ролей пользователя(свя).
Статическая роль – то что принято считать: роль, которая обеспечивает для ее пользователей повсеместный доступ для объектов определенного класса ВНЕ зависимости от свойств этих объектов. Например, роль «Администратор заказов» — значит то, что пользователи этой роли имеют доступ к любому объекту заказ.
Динамическая роль – здесь доступ к объекту рассчитывается исходя из свойств самих объектов(рантайм определение связей между объектами-субъектами). Например: роль «Ответственный за заказы» — будет иметь доступ не ко всем заказам, а только к тем, у которых он поставлен ответственным, т.е. к тем объектам-заказам у которых в свойстве «ответственный» указан id этого пользователя.
Обычно права вот этих динамических ролей разруливаются в различного рода менеджерах объектов, т.е. в дополнительном слое, вышестоящем над DAL-ом и security-level. Т.е. для расчета доступа к объекту(ам) сначала стандартным образом security-level проверяет статичные роли, если там нет доступа, то делает запросы к БД для выяснения того, должен ли у этого пользователя быть доступ к данному объекту(ам) на основании каких-либо динамических ролей. Например для того же «Ответственного за заказы» — это будет дополнительный запрос в БД, который даст нам: совпадает ли id ответственного у данного заказа с id текущего пользователя.
Так вот, это же получается то, что вот эти вот права динамических ролей, их расчет мы выносим из security-level и уже в другом, более высокоуровневом слое, вручную проверяем дополнительными запросами к БД.
И вот вопрос в том, как спланировать архитектуру этого security-level, чтобы это все инкапсулировать в нем. Т.е. мы говорим ему просто: «От имени текущего пользователя – выбрать объекты такого-то класса». Он сам смотрит сначала статические права, потом каким-то образом проверяет нет ли у пользователя доступа к объекту по каким-то его динамическим ролям – и выдает результат. Например, для админа заказов – этот запрос должен будет выдать все объекты-заказы, для Ответсвенных за заказы – все заказы, у которых ответственный == текущему пользователю и т.д.
Вся проблема в том, как построить такую архитектуру, которая позволит легко и универсально добавлять, удалять динамические роли вместе со стратегиями их вычисления в этот security level.
Можно например, иметь в базе справочник динамических ролей и к каждому id этой роли жестко привязать код правила который будет определять доступность объектов по этой роли.
Как еще можно разрулить такую ситуацию? Не хотелось бы изобретать велосипед, т.к. подозреваю, что я далеко не первый кто над этим задумался и пытается реализовать. Кто как реализовал подобные ситуции? Где почитать о реализации таких моделей безопасности? Куда копать ?