1

현재 새로운 반응 형 스택을 경험하고 있으며 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을 찾을 수 있습니다 .

답변

0

스프링 프레임 워크의 스프링 웹 모듈은 기본적으로 쿠키를 기반으로하는 CookieWebSessionIdResolver를 사용합니다. HeaderWebSessionIdResolver 타입의 다른 bean을 생성하면 Spring Session에 의해 자동으로 선택되고 헤더 기반 전략으로 전환됩니다.

두 가지 전략 중 하나는 들어오는 ServerExchange 헤더를 읽고 Cookie 헤더 또는 세션 http 헤더를 읽는지에 관계없이 세션 ID를 조회하는 것입니다.

이러한 전략은 클라이언트 (웹 브라우저 또는 코드)가 쿠키를 채우는 설정 쿠키 지시문이든, 또는 SESSION 헤더 (HeaderWebSessionIdResolver의 헤더 이름의 기본 이름)를 제공할지 여부와 관계없이 응답 헤더를 생성합니다. .

+0

나는 이것을 명확하게 알고 있으며,'WebSessionIdResolver'에 대한 테스트 코드를 읽었습니다. 그러나 샘플에서 Spring Session 및 Spring Security와 함께 사용하면 예상대로 작동하지 않습니다. 내 curl을 사용하여 API를 테스트했으며, 세션 정보가 응답 헤더에 추가되지 않았고, 추가 단계에서 첫 번째 요청에서 가져온 세션을 확인하지 않았습니다. – Hantsy

+0

내 코드를 Spring Boot 2.0.0.M6으로 업데이트하고 작동하게하려면 [샘플 코드] (https://github.com/hantsy/spring-reactive-sample/tree/master/session-header)를 확인하십시오. – Hantsy