Spring Security:檢查用户是否具有角色(Java)

Spring Security
Remote
0
06:04 AM · Nov 30 ,2025

1. 簡介

在 Spring Security 中,有時需要檢查已認證的用户是否具有特定角色。 這對於在我們的應用程序中啓用或禁用特定功能非常有用

在本教程中,我們將探討在 Java 中檢查用户角色的方法,適用於 Spring Security。

2. 檢查 Java 中用户角色

Spring Security 提供多種在 Java 代碼中檢查用户角色的方法。 我們將在下面查看每種方法。

2.1. @PreAuthorize

檢查 Java 中用户角色的第一種方法是使用 Spring Security 提供的 @PreAuthorize 註解。 此註解可以應用於類或方法,並接受一個字符串值,該值表示一個 SpEL 表達式。

在使用此註解之前,我們必須首先啓用全局方法安全。 這可以通過在 Java 代碼中添加 @EnableGlobalMethodSecurity 註解到任何配置類中來實現。

然後,Spring Security 提供兩個我們可以與 @PreAuthorize 註解一起使用的表達式來檢查用户角色:

@PreAuthorize("hasRole('ROLE_ADMIN')")
@GetMapping("/user/{id}")
public String getUser(@PathVariable("id") String id) {
    ...
}

我們也可以在一個表達式中檢查多個角色:

@PreAuthorize("hasAnyRole('ROLE_ADMIN','ROLE_MANAGER')")
@GetMapping("/users")
public String getUsers() {
    ...
}

在這種情況下,如果用户具有指定角色中的 任何一個 角色,請求將被允許。

如果未具有正確的角色調用方法,Spring Security 會拋出異常並重定向到錯誤頁面。

2.2. SecurityContext

我們檢查 Java 代碼中用户角色的一種方法是使用 SecurityContext 類。

默認情況下,Spring Security 使用該類的線程本地副本。 這意味着 我們的應用程序中的每個請求都有其安全上下文,其中包含發起請求的用户詳細信息

要使用它,我們只需調用 SecurityContextHolder 中的靜態方法:

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null && auth.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("ADMIN"))) {
    ...
}

請注意,我們在這裏使用純粹的權限名稱,而不是帶有前綴的完整角色名稱。

這在我們需要進行更細粒度的檢查時非常有效——例如,單個方法中的特定部分。 但是,此方法在 Spring Security 使用全局上下文持有器模式時將不起作用

2.3. UserDetailsService

我們查找 Java 代碼中用户角色的一種方法是使用 UserDetailsService。 這是一個我們可以注入到應用程序的任何位置並按需調用的 Bean:

@GetMapping("/users")
public String getUsers() {
    UserDetails details = userDetailsService.loadUserByUsername("mike");
    if (details != null && details.getAuthorities().stream()
      .anyMatch(a -> a.getAuthority().equals("ADMIN"))) {
        // ...
    }
}

再次,我們在這裏使用權限名稱,而不是帶有前綴的完整角色名稱。

此方法的優點是我們可以檢查任何用户的角色,而不僅僅是發起請求的用户

2.4. Servlet 請求

如果我們在 Spring MVC 中使用,我們也可以使用 HttpServletRequest 類在 Java 中檢查用户角色:

@GetMapping("/users")
public String getUsers(HttpServletRequest request) {
    if (request.isUserInRole("ROLE_ADMIN")) {
        ...
    }
}

3. 結論

在本文中,我們看到了幾種使用 Java 代碼和 Spring Security 檢查角色的方法。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.