用户

用户实体

Jmix 应用程序的用户使用 User 类定义,该类在使用 Studio 创建新项目时自动生成。是一个实现了 JmixUserDetails 接口的 JPA 实体,接口中包含框架需要的一些方法:

  • getUsername() 返回唯一用户名。

  • getPassword() 返回加密(hash)后的用户密码。

  • isEnabled()isAccountNonExpired()isAccountNonLocked()isCredentialsNonExpired() 表示用户是否可以登录系统。

  • getAuthorities()setAuthorities(),在登录时框架用于为用户设置权限。

用户保存在应用程序的主数据库中。默认情况下,User 实体和对应的数据库表具有以下属性:

  • idversion 是标准的主键和乐观锁属性。

  • usernamepasswordenabled 保存 JmixUserDetails 接口中方法返回的值。

  • emailfirstNamelastName 保存用户的其他属性。

你可以定义应用程序所需的任意数量的附加属性,例如,departmentposition

用户管理

一个新项目包含 010-init-user.xml 数据库迁移 脚本,该脚本创建用户名/密码为 admin / admin 的用户,通过给实体分配 system-full-access 角色 授予对系统的完全访问权限。

一个新项目还包含用于管理用户的 UI 视图,请查看主菜单的 ApplicationUsers(用户)。这些视图支持创建、编辑和删除用户,以及更改和重置用户密码。如需为用户分配角色,点击用户列表视图中的 Role assignments(角色分配) 按钮。

新应用程序项目中包含了 ui-minimal 角色,该角色授予登录 UI 和打开主视图的权限。新用户需要分配此角色才能与通过 UI 进行交互,否则他们将无法登录。
参考 User Registration 示例项目了解如何实现用户的自注册。

内置用户

任何具有标准安全子系统的 Jmix 应用程序都有两个内置的用户对象:

  • Anonymous 匿名用户,对应于无认证信息的用户。支持在用户未登录时授予某些权限。

  • System 系统管理员用户,系统授权 机制需要此用户对象。当没有真正的用户与应用程序交互时使用该用户,例如,当应用程序启动时,或者当计划任务执行业务方法时。

内置用户对象没有保存在数据库,而是在应用程序启动时由 DatabaseUserRepository 类创建。可以在此类的 initAnonymousUser()initSystemUser() 方法中对这两个用户进行定制化。默认情况下,系统用户具有 system-full-access 角色,因此拥有所有权限。

匿名用户默认没有权限。

替代用户

系统管理员可以赋予用户替代另一个用户的能力。替代意味着用户拥有被替换用户的全部 资源行级 角色。例如,如果张三代替李四,那么当他以张三的身份登录应用程序时,具有李四的角色。

如需实际了解这些功能,请按照下列步骤:

  1. admin 用户登录,创建至少一个用户,并分配 UI: minimal access 角色。

  2. Users(用户) 表选择 admin,然后点击 Additional(更多) → User substitution(用户替代)。可以看到 admin 已经能替代的用户列表。

  3. 创建一个 admin 能替代的用户添加至列表中。

  4. 现在可以看到主界面的 userIndicator 组件从显示当前用户名变成了一个包含可替代用户的下拉列表。如果选择一个替代用户,工作区会发生变化,就像重新用替代用户登录一样。但是所有的审计功能仍然使用实际登录用户 admin

CurrentUserSubstitution bean 可用于获取当前替代的用户、已认证用户或有效用户(在发生替代时为替代用户,否则为认证用户)。

示例:

@Autowired
private CurrentUserSubstitution currentUserSubstitution;

private String getSubstitutedUserName() {
    User substitutedUser = (User) currentUserSubstitution.getSubstitutedUser();
    return substitutedUser == null ? "" : substitutedUser.getUsername();
}
  • CurrentAuthentication.getUser() 方法总是返回认证用户。

  • CurrentAuthentication.getAuthentication().getAuthorities() 返回有效用户的授权。即,在替代发生时,这些授权与认证用户的授权不一致。