本篇記錄在Spring Security WebFlux的簡單配置。
在類別掛上@EnableWebFluxSecurity
使其為WebFlux Security配置類。
以下配置建立一個簡單的使用者,
帳號:user123
,
密碼:user123
。
配置一個密碼加密方式為BCrypt;
配置表單登入及被保護的資源/api/**
,
開放的資源/join
用來註冊。
package com.abc.demo.config.security;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
import org.springframework.security.config.web.server.ServerHttpSecurity;
import org.springframework.security.core.userdetails.MapReactiveUserDetailsService;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.server.SecurityWebFilterChain;
@EnableWebFluxSecurity
public class WebFluxSecurityConfig {
@Bean
public SecurityWebFilterChain securitygWebFilterChain(ServerHttpSecurity http) {
return http.csrf().disable() // 停用 csrf
.formLogin().and() // 表單登入
.authorizeExchange()
.pathMatchers("/api/**").authenticated() // /api/** 下的資源存取必須驗證
.pathMatchers("/join").permitAll() // /join 無須驗證,註冊用
.and()
.build();
}
// 作用類似Spring Security的InMemoryUserDetailsManager
@Bean
public MapReactiveUserDetailsService userDetailsService() {
// 配置一個使用者帳號:user123, 密碼:user123
UserDetails user = User.withUsername("user123")
.password("user123").passwordEncoder(e -> {
return passwordEncoder().encode(e);
})
.roles("USER")
.build();
return new MapReactiveUserDetailsService(user);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(); // 密碼加密
}
}
參考:
沒有留言:
張貼留言