Здравствуйте!
В настоящий момент подсистема безопасности CUBA “из коробки” функционирует на основе разрешающей политики доступа (принцип “разрешено все, что явно не запрещено”):
- Если доступ к объекту явно не запрещен, то пользователь имеет доступ к этому объекту.
- При назначении двух ролей, одна из которых запрещает, а другая разрешает доступ, пользователю разрешен доступ (объединение с помощью логического “ИЛИ”).
Хочется реализовать запрещающую политику доступа (принцип “запрещено все, что явно не разрешено”):
- Пользователю запрещен доступ к объекту, если на него явно не выдано разрешение.
- При назначении двух ролей, одна из которых запрещает, а другая разрешает доступ, пользователю запрещен доступ (объединение с помощью логического “И”).
Возможно ли сделать подобные изменения, например, путем переопределения логики платформы?
Изучая механизмы платформы, пришел к следующим выводам:
- Запрет на доступ по умолчанию можно реализовать, создав запрещающую роль и точечно разрешая в ней доступ к сущностям, но:
- не получится реализовать объединение разрешений из нескольких ролей с помощью логического “И”;
- наверняка пользователь все-таки должен иметь доступ к каким-то системным сущностям (например, тот же
sec$User
) для минимального функционирования системы, а определить набор таких сущностей затруднительно.
- Права доступа проверяются внутри класса
com.haulmont.cuba.security.global.UserSession
, который не является бином и имеет наследников - соответственно не очень понятно, как переопределить его реализацию. Можно изменить логику наполненияUserSession
путем переопределенияcom.haulmont.cuba.security.sys.UserSessionManager
, но детально с этим еще не разбирался.
Еще один связанный вопрос: можно ли запретить пользователю доступ к системным сущностям через стандартный REST API? В текущей парадигме получается, что пользователь по умолчанию через REST может получить доступ к списку пользователей (http://{server}:{port}/app/rest/v2/entities/sec$User), назначенных заданий (http://{server}:{port}/app/rest/v2/entities/sys$ScheduledTask) и т.п.
Заранее спасибо за ответы!