Безопасность
Подсистема безопасности Jmix предоставляет легко настраиваемый механизм контроля доступа для приложений. Она основана на Spring Security и предлагает следующие функции:
-
Интеграция с моделью данных.
-
Разрешения для вызова операций CRUD над сущностями и для просмотра/изменения определенных атрибутов сущностей. Например, пользователь может просматривать документы, но не может создавать, изменять и удалять их, и может просматривать все атрибуты документа, кроме
amount
. -
Контроль доступа на уровне строк ограничивает доступ к определенным экземплярам сущности. Например, пользователь может просматривать только те документы, которые были созданы в его отделе.
-
-
Интеграция с UI.
-
Разрешения для открытия экранов UI и просмотра пунктов главного меню.
-
Если визуальный компонент, такой как TextField, привязан к атрибуту сущности, он автоматически становится доступным только для чтения или скрытым в зависимости от текущих прав пользователя на атрибут. Действия с таблицей отключаются, если пользователю запрещены соответствующие операции CRUD.
-
-
Декларативное определение ролей и разрешений с использованием аннотированных интерфейсов Java.
-
Возможность определять роли и разрешения во время выполнения и сохранять их в базе данных.
-
UI для просмотра ролей и разрешений, назначения ролей пользователям и создания ролей во время выполнения.
В этом руководстве в основном описывается стандартная реализация подсистемы безопасности. Чтобы использовать все ее функции, убедитесь, что файл build.gradle
содержит следующие зависимости:
implementation 'io.jmix.security:jmix-security-starter'
implementation 'io.jmix.security:jmix-security-ui-starter'
implementation 'io.jmix.security:jmix-security-data-starter'
Понятия
Ниже представлено несколько диаграмм, объясняющих основные понятия подсистемы безопасности Jmix.
Контейнеры
Контейнер здесь – это отдельно запускаемый/развертываемый модуль, который выполняет код или хранит данные.
В простом случае Jmix предоставляет все необходимые компоненты безопасности (аутентификацию, авторизацию, управление пользователями и ролями) в одном приложении. Пользователи управляются и аутентифицируются приложением.
При желании вы можете использовать внешнюю службу управления идентификацией и доступом (IAM), такую как OIDC или LDAP. В этом случае пользователи аутентифицируются внешней службой, которая также может предоставить список ролей аутентифицированного пользователя обратно приложению для последующей авторизации.
Управление пользователями и ролями
Роли и политики могут быть определены в приложении как во время разработки с использованием аннотированных классов Java, так и во время выполнения с использованием конфигурации, хранящейся в базе данных.
Когда пользователями управляют в приложении, администратор создает пользователей и назначает им роли с помощью пользовательского интерфейса приложения. Сущность User по умолчанию генерируется для нового проекта.
Если используется внешняя служба IAM, она управляет списком пользователей и, обычно, списком ролей для каждого пользователя. Администратор также настраивает роли и политики в приложении и проверяет, соответствуют ли роли приложения ролям IAM по имени. Таким образом, когда пользователь входит в систему, приложение получает список ролей, назначенных пользователю службой IAM, и использует свою собственную конфигурацию ролей и политик для авторизации.
Также могут существовать смешанные сценарии, когда пользователи создаются как в сервисе IAM, так и в приложении (например, автоматически при входе в систему).
Аутентификация и авторизация пользователя
Механизм аутентификации основан на Spring Security. Jmix предоставляет для Spring Security конфигурацию по умолчанию, а также экран входа в систему, генерируемый в проекте, и бин CurrentAuthentication для получения информации о текущем пользователе.
Когда пользователь работает с приложением, для авторизации его действий запрашивается компонент фреймворка по управлению доступом. Он, в свою очередь, получает информацию о текущих разрешениях пользователя из конфигурации ролей и принимает решение.
Роли и политики
Ниже приведена диаграмма, которая показывает взаимосвязь между пользователями, ролями и политиками.
Пользователь может иметь несколько ролей двух различных типов: ресурсных и уровня строк.
Ресурсные роли предоставляют пользователям разрешения на определенные объекты и операции, которые по умолчанию запрещены. Пользователь без ресурсных ролей не имеет разрешений и не может получить доступ к системе.
Роли уровня строк, напротив, ограничивают доступ к определенным экземплярам сущностей. Пользователь без ролей уровня строк имеет доступ ко всем экземплярам сущности (если это разрешено ресурсными ролями).
Каждая роль может определять политики различных типов. Политики определяют целевой объект (ресурс для ресурных разрешений, экземпляр сущности или группу экземпляров для политик уровня строк) и разрешение или ограничение, применяемые к этому объекту.