安全
Jmix 安全子系统为应用程序提供了一种易于配置的访问控制机制。基于 Spring Security 并添加了以下功能:
-
与数据模型集成。
-
实体 CRUD 操作和查看/修改特定实体属性的权限。例如,用户可以查看文档,但不能创建、更新或删除文档,并且可以查看除
amount
之外的所有文档属性。 -
行级访问控制,限制对单个实体实例的访问。例如,用户只能查看在其部门中创建的文档。
-
-
与 UI 集成。
-
打开 UI 视图和查看主菜单项的权限。
-
如果可视化组件(例如,文本组件)绑定至实体属性,根据当前用户对该属性的权限会自动将可视化组件变为只读或隐藏。如果用户被拒绝使用实体的 CRUD 操作,则也会禁用相应的表格操作。
-
-
使用带注解的 Java 接口声明式的定义角色和权限。
-
运行时定义角色和许可,并保存至数据库。
-
一组用户界面,用于查看角色和权限、为用户分配角色、创建运行时角色。
本章节介绍安全子系统的标准实现。确保 build.gradle
文件包含下列依赖以使用完整功能:
implementation 'io.jmix.security:jmix-security-starter'
implementation 'io.jmix.security:jmix-security-flowui-starter'
implementation 'io.jmix.security:jmix-security-data-starter'
概念
下面我们展示几个图表,用于解释 Jmix 安全子系统的主要概念。
容器
这里的容器是指一个独立的可运行/可部署的单元,用于执行代码或保存数据。
在简单的情况下,Jmix 为单个应用程序提供了所有必要的安全组件(身份验证、授权、用户和角色管理)。用户交由应用程序管理和进行身份验证。
或者,您可以使用外部身份和访问管理 (IAM) 服务,如 OIDC 或 LDAP。在这种情况下,用户由外部服务进行身份验证,外部服务还可以将经过身份验证的用户的角色列表返回给应用程序以进行后续授权。
用户和角色管理
角色和策略可以在设计时使用带注解的 Java 类在应用程序中定义,也可以在运行时通过存储在数据库中的配置来定义。
当在应用程序中对用户进行管理时,管理员将使用应用程序 UI 创建用户并为其分配角色。默认情况下,将为新项目自动生成 User 实体。
如果使用外部 IAM 服务,则用户列表由该服务管理,并且通常也管理每个用户的一组角色。管理员需要在应用程序中配置角色和策略,并确保应用程序角色名称与 IAM 的角色匹配。因此,当用户登录到系统时,应用程序将获取 IAM 服务分配给用户的角色列表,并使用自己的角色和策略配置进行授权。
也可能存在混合场景,同时在 IAM 服务和应用程序中创建用户(例如,在登录时自动创建用户)。
用户认证和授权
认证机制基于 Spring Security。Jmix 提供默认 Spring Security 配置,以及在项目中生成的登录视图和 CurrentAuthentication bean - 用于获取有关当前用户的信息。
当用户使用应用程序时,会请求框架的访问控制组件对用户操作进行授权。首先从角色配置中获取有关当前用户权限的信息,然后做出授权决策。