Spring WebFlux安全配置教程和原始碼 - vinsguru
教程演示Spring WebFlux Security反應式Web應用程式的安全性。
假設一個具有3個API端點的簡單應用程式。我們需要具有如下所示的安全性。
路徑:/home/admin 角色:ADMIN 路徑:/home/user 角色:ADMIN, USER 路徑:/home/any 角色:ADMIN |
第一步:
我使用以下端點建立一個REST控制器:
@RestController @RequestMapping("home") public class AuthController { @GetMapping("user") public Mono<String> userHome(){ return Mono.just("user home"); } @GetMapping("admin") public Mono<String> adminHome(){ return Mono.just("admin home"); } @GetMapping("any") public Mono<String> any(){ return Mono.just("authenticated home"); } } |
Spring WebFlux安全配置:
- 建立一個配置類,以使用允許的角色/許可權配置路徑,如下所示。
- 只要經過身份驗證,應用程式中的任何人都可以使用任何其他路徑(例如:/ home / any)。
@EnableWebFluxSecurity public class WebSecurityConfig { @Bean public PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); } @Bean public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { http.authorizeExchange() .pathMatchers("/home/user").hasAnyRole("USER", "ADMIN") .pathMatchers("/home/admin").hasRole("ADMIN") .anyExchange() .authenticated() .and() .formLogin(); return http.build(); } } |
@EnableReactiveMethodSecurity
如果您不喜歡上面的配置路徑匹配器和角色方法,我們可以使安全性保持簡單,如下所示。
@EnableWebFluxSecurity @EnableReactiveMethodSecurity public class WebSecurityConfig { @Bean public PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); } @Bean public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { http.authorizeExchange() .anyExchange() .authenticated() .and() .formLogin(); return http.build(); } } |
我們可以在方法上新增PreAuthorize / PostAuthorize註釋以提供類似的行為。
@GetMapping("user") @PreAuthorize("hasRole('USER')") public Mono<String> userHome(){ return Mono.just("user home"); } @GetMapping("admin") @PreAuthorize("hasRole('ADMIN')") public Mono<String> adminHome(){ return Mono.just("admin home"); } |
第二步 使用者資料庫:
我需要一個使用者資料庫。我正在將Map用於此演示目的。
- 我們需要使用使用者名稱,密碼和使用者特定角色來構建UserDetails物件
@Configuration public class UserDB { @Autowired private PasswordEncoder passwordEncoder; @Bean public Map<String, UserDetails> map(){ return Map.of( "user", User.withUsername("user").password(passwordEncoder.encode("user")).roles("USER").build(), "admin", User.withUsername("admin").password(passwordEncoder.encode("admin")).roles("ADMIN").build(), "any", User.withUsername("any").password(passwordEncoder.encode("any")).authorities(Collections.emptyList()).build() ); } } |
最後一步,我們需要ReactiveUserDetailsService實現根據使用者名稱返回使用者詳細資訊。
@Service public class UserDetailsServiceImpl implements ReactiveUserDetailsService { @Autowired private Map<String, UserDetails> map; @Override public Mono<UserDetails> findByUsername(String username) { return Mono.just(this.map.get(username)); } } |
啟動應用程式。嘗試訪問任何上述配置的端點。該應用程式將自動將您重定向到登入頁面。
相關文章
- Spring Boot的微服務分散聚集模式教程與原始碼 - vinsguruSpring Boot微服務模式原始碼
- Spring安全的角色和許可權原始碼與教程 - javadevjournalSpring原始碼Javadev
- Spring WebFlux 基礎教程:WebSocket 使用SpringWebUX
- Reactive Spring實戰 -- WebFlux使用教程ReactSpringWebUX
- Spring Boot 2.0 WebFlux 教程 (一) | 入門篇Spring BootWebUX
- Spring WebFlux 基礎教程:引數校驗SpringWebUX
- Spring WebFlux和Reactive程式設計SpringWebUXReact程式設計
- 使用Spring Boot + Kafka實現Saga分散式事務模式的原始碼 - vinsguruSpring BootKafka分散式模式原始碼
- vim-配置教程+原始碼原始碼
- 深入剖析 Spring WebFluxSpringWebUX
- WebFlux 和 Spring Security 會碰出哪些火花?WebUXSpring
- 5.2 spring5原始碼--spring AOP原始碼分析二--切面的配置方式Spring原始碼
- 使用Spring Boot排程WebSocket推送的教程和原始碼 - BaeldungSpring BootWeb原始碼
- Spring Boot 自動配置 原始碼分析Spring Boot原始碼
- Spring Webflux國際化SpringWebUX
- Spring Webflux與事務SpringWebUX
- Mybatisi和Spring整合原始碼分析MyBatisSpring原始碼
- Spring原始碼分析——搭建spring原始碼Spring原始碼
- Spring Boot支援Java 16和新的Java記錄原始碼教程 | foojaySpring BootJava原始碼
- Spring WebFlux之HttpHandler的探索SpringWebUXHTTP
- 結合GraalVM與Spring Native的Spring Boot原始碼教程 | foojayLVMSpring Boot原始碼
- Java程式設計方法論-Spring WebFlux篇 01 為什麼需要Spring WebFlux 上Java程式設計SpringWebUX
- Java程式設計方法論-Spring WebFlux篇 01 為什麼需要Spring WebFlux 下Java程式設計SpringWebUX
- Spring原始碼之事務(一)— TransactionAutoConfiguration自動配置Spring原始碼
- 精盡Spring Boot原始碼分析 - 配置載入Spring Boot原始碼
- Spring WebFlux效能真的超過Spring Servlet ? - GavinSpringWebUXServlet
- 使用Java和Spring WebFlux構建響應式微服務JavaSpringWebUX微服務
- Spring Boot Security配置教程Spring Boot
- 使用Spring Boot實現Redis事務 | VinsguruSpring BootRedis
- 【spring原始碼學習】Spring @PostConstruct和@PreDestroy例項Spring原始碼Struct
- Spring boot webflux 中實現 RequestContextHolderSpring BootWebUXContext
- Spring WebFlux的明顯陷阱 - ŁukaszKyćSpringWebUX
- Spring Boot中實現規則引擎原始碼教程Spring Boot原始碼
- Spring Boot的Clean架構教程與原始碼 - BaeldungSpring Boot架構原始碼
- Spring Boot 原始碼分析 資料來源 + Mybatis 配置Spring Boot原始碼MyBatis
- Spring原始碼解析02:Spring IOC容器之XmlBeanFactory啟動流程分析和原始碼解析Spring原始碼XMLBean
- Spring 6 原始碼編譯和高效閱讀原始碼技巧分享Spring原始碼編譯
- 再讀Spring原始碼-Spring的啟動和載入Spring原始碼