1. 概述
JHipster 默認包含兩個角色——USER 和 ADMIN,但有時我們需要添加自定義角色。
在本教程中,我們將創建一個名為 MANAGER 的新角色,以便為用户提供額外的權限。
請注意,JHipster 使用“authorities”一詞與“roles”有時會互換使用。 無論哪種方式,我們基本上指的是相同的東西。
2. 代碼變更
創建新角色第一步是更新類 AuthoritiesConstants。該文件在創建新的 JHipster 應用程序時會自動生成,其中包含應用程序中所有角色和權限的常量。
為了創建我們的新 MANAGER 角色,我們只需在該文件中添加一個新的常量:
public static final String MANAGER = "ROLE_MANAGER";3. 模式變更
下一步是定義新的角色,添加到我們的數據存儲中。
JHipster 支持多種持久化數據存儲,並創建一個初始設置任務,該任務將數據存儲中填充為用户和權限。
要將新的角色添加到數據庫設置中,我們需要編輯 InitialSetupMigration.java 文件。它已經有一個名為 addAuthorities 的方法,我們只需將新的角色添加到現有代碼中:
public void addAuthorities(MongoTemplate mongoTemplate) {
// Add these lines after the existing, auto-generated code
Authority managerAuthority = new Authority();
managerAuthority.setName(AuthoritiesConstants.MANAGER);
mongoTemplate.save(managerAuthority);
}本示例使用 MongoDB,但步驟與 JHipster 支持的其他持久化存儲非常相似。
請注意,某些數據存儲,如 H2,僅依賴於名為 authorities.csv 的文件,因此沒有生成任何需要更新的代碼。
4. 使用我們的新角色
現在我們已經定義了新的角色,讓我們看看如何在我們的代碼中使用它。
4.1. Java 代碼
在後端,有兩主要方法來檢查用户是否具有執行操作的權限。
首先,我們可以修改 SecurityConfiguration 以限制對特定 API 的訪問:
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)) {
// perform some logic that is applicable to manager role
}4.2. 前端 (Front-End)
JHipster 提供兩種方法來在前端檢查角色權限。請注意,這些示例使用 Angular,但類似構造也適用於 React。
首先,任何模板中的元素都可以使用 *jhiHasAnyAuthority 指令。它接受單個字符串或字符串數組作為參數:
<div *jhiHasAnyAuthority="'ROLE_MANAGER'">
<!-- manager related code here -->
</div>其次,Principal 類可以檢查用户是否具有特定的角色:
isManager() {
return this.principal.identity()
.then(account => this.principal.hasAnyAuthority(['ROLE_MANAGER']));
}5. 結論
在本文中,我們瞭解到在 JHipster 中創建新的角色和權限有多麼簡單。雖然默認的 USER 和 ADMIN 角色對於大多數應用程序來説是一個不錯的起點,但額外的角色提供了更大的靈活性。
通過額外的角色,我們可以更好地控制哪些用户可以訪問 API 以及他們可以在前端看到哪些數據。