1. 概述

JHipster 默认提供了两个角色:USERADMIN。但在实际开发中,我们往往需要定义自己的角色。

本教程将以创建一个名为 MANAGER 的新角色为例,展示如何为用户赋予额外的权限。

⚠️ 需要注意的是,JHipster 中 authoritiesroles 这两个术语基本可以混用,它们表达的含义是一致的。

2. 修改代码

要新增一个角色,第一步是更新 AuthoritiesConstants 类。这个类在生成 JHipster 应用时自动生成,用于定义应用中所有角色和权限常量。

✅ 要添加 MANAGER 角色,只需在这个类中加入如下常量:

public static final String MANAGER = "ROLE_MANAGER";

3. 数据库结构变更

接下来我们要在数据存储中定义这个新角色。

JHipster 支持多种持久化方案,并会自动生成初始化脚本,用于填充用户和权限数据。

✅ 如果你使用的是 MongoDB,那么你需要编辑 InitialSetupMigration.java 文件。该文件中已有一个 addAuthorities 方法,我们只需要在里面添加新角色即可:

public void addAuthorities(MongoTemplate mongoTemplate) {
    // 在已有代码后追加以下内容
    Authority managerAuthority = new Authority();
    managerAuthority.setName(AuthoritiesConstants.MANAGER);
    mongoTemplate.save(managerAuthority);
}

💡 不同的数据存储方式(如 MySQL、PostgreSQL)操作类似,但具体实现略有不同。

⚠️ 特别提醒:像 H2 这样的内存数据库依赖的是 authorities.csv 文件,因此不需要修改 Java 初始化代码。

4. 使用新角色

现在角色已经定义好了,来看看怎么在前后端使用它。

4.1. 后端使用方式

在后端,有两种主要方式来判断当前用户是否拥有某个角色权限。

✅ 方式一:修改 SecurityConfiguration 来限制接口访问

public SecurityFilterChain filterChain(HttpSecurity http, MvcRequestMatcher.Builder mvc) throws Exception {
    http.authorizeHttpRequests(authz -> authz.requestMatchers(mvc.pattern("/management/**"))
        .hasAuthority(AuthoritiesConstants.MANAGER));
    return http.build();
}

✅ 方式二:通过 SecurityUtils 工具类动态判断用户权限

if (SecurityUtils.isCurrentUserInRole(AuthoritiesConstants.MANAGER)) {
    // 执行只有 MANAGER 角色才能进行的操作
}

4.2. 前端使用方式

JHipster 提供了两种方式在前端检查角色权限(示例基于 Angular,React 也有类似机制)。

✅ 方式一:模板中使用指令 *jhiHasAnyAuthority

<div *jhiHasAnyAuthority="'ROLE_MANAGER'">
    <!-- 只有 MANAGER 角色能看到的内容 -->
</div>

✅ 方式二:使用 Principal 类判断权限

isManager() {
    return this.principal.identity()
      .then(account => this.principal.hasAnyAuthority(['ROLE_MANAGER']));
}

5. 小结

这篇文章展示了在 JHipster 中添加自定义角色是多么简单直接。虽然默认的 USERADMIN 已经能满足大部分场景,但自定义角色能带来更灵活的权限控制能力。

通过增加角色,我们可以精细化地控制哪些用户可以访问特定 API,以及他们在前端能看到哪些数据。

📘 示例代码可从 GitHub 获取。


原始标题:Creating New Roles and Authorities in JHipster