1. 概述
JHipster 默认提供了两个角色:USER
和 ADMIN
。但在实际开发中,我们往往需要定义自己的角色。
本教程将以创建一个名为 MANAGER
的新角色为例,展示如何为用户赋予额外的权限。
⚠️ 需要注意的是,JHipster 中 authorities 和 roles 这两个术语基本可以混用,它们表达的含义是一致的。
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 中添加自定义角色是多么简单直接。虽然默认的 USER
和 ADMIN
已经能满足大部分场景,但自定义角色能带来更灵活的权限控制能力。
通过增加角色,我们可以精细化地控制哪些用户可以访问特定 API,以及他们在前端能看到哪些数据。
📘 示例代码可从 GitHub 获取。