Spring Security @PreAuthorize注解分析
@PreAuthorize 注解在 Spring Security 中提供了一種聲明式的方法,可以在您的 Spring Boot 應(yīng)用中添加方法級別的安全檢查。本教程將引導(dǎo)您設(shè)置并有效使用 @PreAuthorize,確保用戶只能在具有特定角色或權(quán)限的情況下調(diào)用 REST API。
什么是 @PreAuthorize?
@PreAuthorize 是 Spring Security 的一個注解,用于指定在方法調(diào)用前應(yīng)評估的表達(dá)式,以確定調(diào)用者是否有權(quán)執(zhí)行該方法。
將 Spring Security 添加到項目中
確保您的項目中包含 Spring Security。對于 Maven,將以下依賴項添加到 pom.xml 文件中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>對于 Gradle,將以下內(nèi)容添加到 build.gradle 文件中:
implementation 'org.springframework.boot:spring-boot-starter-security'
啟用方法級安全
要在 Spring Boot 應(yīng)用的 Rest Controller 類中對特定方法應(yīng)用 Spring Security,必須啟用方法級安全。為此,您需要使用 @EnableMethodSecurity 注解。
@Configuration
@EnableMethodSecurity
public class SpringSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.csrf(csrf -> csrf.disable())
.authorizeHttpRequests(authorize -> authorize
.requestMatchers(HttpMethod.GET, "/api/user").hasRole("USER")
.requestMatchers(HttpMethod.GET, "/api/admin").hasRole("ADMIN")
.anyRequest().authenticated()
)
.httpBasic(Customizer.withDefaults());
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails ramesh = User.builder()
.username("ramesh")
.password(passwordEncoder().encode("password"))
.roles("USER")
.build();
UserDetails admin = User.builder()
.username("admin")
.password(passwordEncoder().encode("admin"))
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(ramesh, admin);
}
}@EnableMethodSecurity 是一個 Spring 注解,用于在 Spring 應(yīng)用中啟用方法級安全。使用此注解后,Spring 將為包含安全方法的類創(chuàng)建代理,并在調(diào)用這些方法時攔截以檢查調(diào)用者是否具有執(zhí)行方法所需的權(quán)限。
此注解與其他注解(如 @PreAuthorize、@PostAuthorize、@Secured 和 @RolesAllowed)一起工作,這些注解用于指定方法的訪問控制規(guī)則。例如,您可以使用 @PreAuthorize 指定只有具有特定角色或權(quán)限的用戶才能調(diào)用某個方法;或者使用 @PostAuthorize 指定方法只返回調(diào)用者有權(quán)查看的數(shù)據(jù)。
使用 @PreAuthorize 注解保護(hù) REST API
以下代碼展示了如何使用 Spring Security 進(jìn)行基于角色的 RESTful 端點授權(quán)。
@RestController
@RequestMapping("/api/")
public class AdminController {
@PreAuthorize("hasRole('ADMIN')")
@GetMapping("/admin")
public ResponseEntity<String> helloAdmin() {
return ResponseEntity.ok("Hello Admin");
}
@PreAuthorize("hasRole('USER')")
@GetMapping("/user")
public ResponseEntity<String> helloUser() {
return ResponseEntity.ok("Hello User");
}
}@PreAuthorize("hasRole('ADMIN')"): 應(yīng)用于helloAdmin()方法,表示只有具有 ‘ADMIN’ 角色的用戶才能訪問此端點。@PreAuthorize("hasRole('USER')"): 應(yīng)用于helloUser()方法,限制只有具有 ‘USER’ 角色的用戶才能訪問。
總結(jié)
本教程介紹了如何使用 Spring 方法級安全和 @PreAuthorize 注解來保護(hù) RestController 方法。通過這些步驟,您可以確保只有具有適當(dāng)角色或權(quán)限的用戶才能訪問特定的 REST API。
到此這篇關(guān)于Spring Security @PreAuthorize注解分析的文章就介紹到這了,更多相關(guān)Spring Security @PreAuthorize內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中實現(xiàn)線程的創(chuàng)建和啟動的方法
在 Java 中,實現(xiàn)線程的創(chuàng)建和啟動是兩個不同但緊密相關(guān)的概念,理解為什么要啟動線程(調(diào)用 start() 方法)而非直接調(diào)用 run() 方法,是掌握多線程編程的關(guān)鍵,本文給大家詳細(xì)介紹了Java線程創(chuàng)建和啟動的方法,需要的朋友可以參考下2025-06-06
SpringBoot使用admin+actuator實現(xiàn)日志可視化的方法
如何在SpringBoot中使用Admin和Actuator實現(xiàn)日志可視化,需配置pom依賴、yml參數(shù)及l(fā)ogback路徑,確保兩者一致,啟動服務(wù)后通過指定端口訪問日志界面,并檢查404錯誤原因,感興趣的朋友一起看看吧2025-06-06
Springboot使用異步方法優(yōu)化Service邏輯,提高接口響應(yīng)速度方式
這篇文章主要介紹了Springboot使用異步方法優(yōu)化Service邏輯,提高接口響應(yīng)速度方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-06-06
Java中JavaBean對象和Map的互相轉(zhuǎn)換方法實例
為什么需要將javaBean和map進(jìn)行轉(zhuǎn)換,在很多應(yīng)用場景中,需要將key=value形式的數(shù)據(jù)與javaBean對象相互轉(zhuǎn)換,下面這篇文章主要給大家介紹了關(guān)于Java中JavaBean對象和Map的互相轉(zhuǎn)換的相關(guān)資料,需要的朋友可以參考下2022-11-11
在Android的應(yīng)用中實現(xiàn)網(wǎng)絡(luò)圖片異步加載的方法
這篇文章主要介紹了在Android的應(yīng)用中實現(xiàn)網(wǎng)絡(luò)圖片異步加載的方法,一定程度上有助于提高安卓程序的使用體驗,需要的朋友可以參考下2015-07-07
Java判斷一個時間是否在當(dāng)前時間區(qū)間代碼示例
這篇文章主要給大家介紹了關(guān)于使用Java判斷一個時間是否在當(dāng)前時間區(qū)間的相關(guān)資料,在日常開發(fā)中我們經(jīng)常會涉及到時間的大小比較或者是判斷某個時間是否在某個時間段內(nèi),需要的朋友可以參考下2023-07-07
Spring的@PreAuthorize注解自定義權(quán)限校驗詳解
這篇文章主要介紹了Spring的@PreAuthorize注解自定義權(quán)限校驗詳解,由于項目中,需要對外開放接口,要求做請求頭校驗,不做其他權(quán)限控制,所以準(zhǔn)備對開放的接口全部放行,不做登錄校驗,需要的朋友可以參考下2023-11-11

