網頁

2019/10/12

Spring Security WebFlux 簡單配置範例

本篇記錄在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(); // 密碼加密
    }

}

參考:

沒有留言:

張貼留言