ตัวอย่างการเขียน Spring-boot Reactive Security
pom.xml
...
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.1</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>build-info</id>
<goals>
<goal>build-info</goal>
</goals>
<configuration>
<additionalProperties>
<java.version>${java.version}</java.version>
</additionalProperties>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
หมายเหตุ
spring-boot-starter-security
เป็น Dependency สำหรับทำ Security เช่น การทำ Login การกำหนดสิทธิ์การเข้าใช้งานต่าง ๆ ในระบบ
@SpringBootApplication
public class AppStarter {
public static void main(String[] args) {
SpringApplication.run(AppStarter.class, args);
}
}
@Slf4j
@Configuration
@EnableWebFluxSecurity
public class SecurityConfig {
@Bean
public ReactiveUserDetailsService reactiveUserDetailsService(final PasswordEncoder passwordEncoder) {
return username -> {
log.debug("login with username => {}", username);
return Mono.just(
User.withUsername(username)
.password(passwordEncoder.encode("password"))
.authorities(Collections.emptyList())
.build()
);
};
}
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
@Configuration
เป็นการบอก spring boot ว่า class นี้เป็น Java Configuration@EnableWebFluxSecurity
เป็นการ enable Spring Security- Method
passwordEncoder()
เป็นการประกาศใช้ password encoder เป็นBCryptPasswordEncoder
- Method
reactiveUserDetailsService()
เป็นการประกาศ login service ว่าถ้ามีการ login เข้ามาให้ find user จาก username ที่ส่งมาใน service นี้ ซึ่งปกติจะ find จาก database ถ้าไม่เจอ อาจจะ throw errororg.springframework.security.authentication.BadCredentialsException
ออกไป - เบื้องต้น สิทธิ์ หรือ authorities กำหนดเป็น empty ไปก่อน
authorities(Collections.emptyList())
@RestController
public class HomeController {
@GetMapping({"", "/"})
public Mono<String> hello(final Authentication authentication) {
return Mono.just("Hello => " + authentication.getName());
}
}
หมายเหตุ
Authentication
คือ ข้อมูลคน Login
cd ไปที่ root ของ project จากนั้น
$ mvn clean package
$ mvn spring-boot:run
เปิด browser แล้วเข้า http://localhost:8080
หลังจากนั้นมันจะเด้งเข้าหน้า login (default จาก Spring Security)
- username = test
- password = password