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)評估的表達式,以確定調(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 注解保護 REST API
以下代碼展示了如何使用 Spring Security 進行基于角色的 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
注解來保護 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 web應(yīng)用線上系統(tǒng)偶發(fā)宕機的情況
這篇文章主要介紹了解決java web應(yīng)用線上系統(tǒng)偶發(fā)宕機的情況,具有好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09JDK多版本共存并自由切換的操作指南(本文為JDK8和JDK17)
本文介紹了如何在Windows系統(tǒng)上配置多版本JDK(以JDK8和JDK17為例),并通過圖文結(jié)合的方式給大家講解了詳細步驟,具有一定的參考價值,需要的朋友可以參考下2025-03-03淺析springcloud 整合 zipkin-server 內(nèi)存日志監(jiān)控
Zipkin是一款開源的分布式實時數(shù)據(jù)追蹤系統(tǒng)(Distributed Tracking System),其主要功能是聚集來自各個異構(gòu)系統(tǒng)的實時監(jiān)控數(shù)據(jù)。這篇文章主要介紹了springcloud 整合 zipkin-server 內(nèi)存日志監(jiān)控,需要的朋友可以參考下2019-11-11java8使用filter()取出自己所需數(shù)據(jù)
這篇文章主要介紹了java8使用filter()取出自己所需數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05SpringBoot Web詳解靜態(tài)資源規(guī)則與定制化處理
這篇文章主要介紹了SpringBoot web場景的靜態(tài)資源規(guī)則與定制化,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-06-06