현재 새로운 반응 형 스택을 경험하고 있으며 Spring Session 2.0에서 반응 형 기능을 사용하려고합니다.Spring webflux 애플리케이션에서 Spring WebSessionIdResolver를 Spring Security 5와 함께 사용하는 방법은 무엇입니까?
전통적인 서블릿 접근 방식에서 스프링 세션은 쿠키 또는 요청 헤더에서 세션을 감지하기 위해 HttpSessionStrategy
을 제공합니다. HeaderHttpSessionStrategy
을 사용하여 RESTful API의 인증 (기본적으로 그 이름은 X-AUTH-TOKEN
)과 같은 토큰을 쉽게 구현할 수 있습니다.
스프링 5 코어는 반응 환경에 대해 동일한 작업을 수행하기 위해 WebSessionIdResolver
을 제공합니다.
그러나 Spring Security와 함께 사용하고 전통적인 방식으로 작업하기를 원한다면 제대로 작동하지 않을 것입니다.
SessionConfig 파일.
@EnableSpringWebSession
public class SessionConfig {
@Bean
public ReactorSessionRepository sessionRepository() {
return new MapReactorSessionRepository(new ConcurrentHashMap<>());
}
@Bean
public WebSessionIdResolver headerWebSessionIdResolver() {
HeaderWebSessionIdResolver resolver = new HeaderWebSessionIdResolver();
resolver.setHeaderName("X-SESSION-ID");
return resolver;
}
}
부분 SecurityConfig.
@EnableWebFluxSecurity
class SecurityConfig {
@Bean
SecurityWebFilterChain springWebFilterChain(HttpSecurity http) throws Exception {
return http
.authorizeExchange()
.pathMatchers(HttpMethod.GET, "/posts/**").permitAll()
.pathMatchers(HttpMethod.DELETE, "/posts/**").hasRole("ADMIN")
//.pathMatchers("https://stackoverflow.com/users/{user}/**").access(this::currentUserMatchesPath)
.anyExchange().authenticated()
.and()
.build();
}
테스트 대기 컨트롤러 파일은 현재 세션 ID를 반환합니다.
@RestController
public class SessionRestController {
@GetMapping("/sessionId")
public Map<String, String> sessionId(WebSession session){
Map<String, String> map = new HashMap<>();
map.put("id", session.getId());
return map ;
}
}
응용 프로그램을 시작하고 curl을 사용하여/sessionId에 액세스하면 세션 헤더에 응답 헤더가 없습니다.
curl -v -u "user:password" http://localhost:8080/sessionId
그리고 질의 결과에서 세션 ID를 가지고 및 보호 된 리소스에 액세스 요청 헤더에 넣고 401
curl -v -X POST -H "X-SESSION-ID:xxxx" http://localhost:8080/posts
이 업데이트 가지고 : 작업 예제가 here을 찾을 수 있습니다 .
나는 이것을 명확하게 알고 있으며,'WebSessionIdResolver'에 대한 테스트 코드를 읽었습니다. 그러나 샘플에서 Spring Session 및 Spring Security와 함께 사용하면 예상대로 작동하지 않습니다. 내 curl을 사용하여 API를 테스트했으며, 세션 정보가 응답 헤더에 추가되지 않았고, 추가 단계에서 첫 번째 요청에서 가져온 세션을 확인하지 않았습니다. – Hantsy
내 코드를 Spring Boot 2.0.0.M6으로 업데이트하고 작동하게하려면 [샘플 코드] (https://github.com/hantsy/spring-reactive-sample/tree/master/session-header)를 확인하십시오. – Hantsy