2014-09-10 4 views
3

나는 SpringMVC를 사용하여 인터페이스하려는 컴퓨터에서 HTTP 요청을 수신합니다. 시스템의 XML 데이터는 HTTP 요청 본문에 기록됩니다. 기본적으로쿠키를 사용하지 않는 스프링 보안 세션

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Foo version="2.0" xmlns="http://www.example.com/ns"> 
    <Bar sessionId="2" /> 
    <Baz quux="Monitor" seq="123"> 
     ... 
    </Baz> 
</Foo> 

기계가 쿠키를 보관하지 못합니다. 그래서 JSESSIONID를 통해 세션 데이터를 사용할 수 없습니다. 내가 가진 것은 Bar에있는 sessionId뿐입니다. 이 sessionId는 첫 번째 요청에서 내 시스템에 의해 부여되어야합니다. 즉,

1 단계 : 기계

2 단계 나에게 세션 요청을 전송 : 웹 응용 프로그램은 세션을 만든 다음 그 다음 저장하고 후속 요청에 사용되는 시스템에 세션 유형 응답을 보냅니다.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Foo version="2.0" xmlns="http://www.example.com/ns"> 
    <Bar sessionId="2" /> 
    <Session quux="Monitor" seq="123"> 
     ... 
    </Session> 
</Foo> 

3 단계 : 컴퓨터와 웹 응용 프로그램 간의 통신에 이제 sessionId가 사용됩니다.

질문 :

  1. 는 봄 보안이 sessionId가 기반으로하는 연결로 세션을 할당 할에 수 있습니까? 이 경우 XML의 sessionId가 쿠키 JSESSIONID처럼 작동합니다. HTTP 헤더 나 URL 대신 XML에서 세션 ID를 검색하도록 스프링 보안을 설정할 수 있습니까?
  2. 다른 시스템에 이런 종류의 문제가 있는지 그리고이 문제에 대해 자세히 조사 할 수 있는지 알고 싶습니다.

답변

6

찾고있는 것이 확실합니다. HTTP 세션은 요청들 사이에 스프링 보안 인증 토큰을 저장하기위한 컨테이너 일뿐입니다. 당신이 찾고있는 곳은 요청 사이에 토큰을 저장하고 모든 요청에 ​​대해 토큰을 안정적으로 검색 할 수있는 장소입니다.

요청간에 토큰을 보유하는 구성 요소는 org.springframework.security.web.context.SecurityContextRepository의 구현입니다. Spring Security가 제공하는 즉시 사용 가능한 구현 중 하나는 HTTP 세션을 토큰의 저장 영역으로 사용합니다.

마찬가지로 모든 요청에서 토큰을 확인하는 구성 요소는 org.springframework.security.authentication.AuthenticationProvider의 구현입니다. 최소한 HTTP 세션 외부의 모든 요청에 ​​대해 인증 토큰을 저장하고 확인하기위한 사용자 지정 전략을 적용하려면이 두 가지 구현이 필요합니다.

REST 기반 응용 프로그램에 대한이 전략의 작동 예는 my sample app을 참조하십시오. 요청 본문 대신 HTTP 헤더로 세션 정보를 전달하는 것이 좋습니다. 구현 노력을 줄이고 솔루션을 크게 단순화합니다.

+0

본인의 의견을 바탕으로 해결책을 찾아 보겠습니다. 내가 너에게 돌아갈거야. 필자의 경우 클라이언트 컴퓨터가하는 일을 제어 할 수 없습니다. 내가 아는 전부는 내가 생성 한 sessionId를 수신하고 후속 요청에서 해당 sessionId를 사용한다는 것입니다. – nmenego

+0

[SecurityContextRepository 구현] (https://github.com/manish-in-java/spring-security-rest/blob/master/api/src/main/scala/org/example/api/security/)을 살펴보십시오. EhcacheSecurityContextRepository.scala)를 샘플 앱에 추가합니다. 요청 헤더를 검사하여 세션 쿠키와 동등한 것이 클라이언트에 의해 보내 졌는지 확인합니다. 그렇다면 메모리 캐시에서 인증 토큰을 추출하여 실행중인 스레드에 연결합니다. 헤더 대신 요청 본문에서 토큰을 추출해야합니다. 이 작업을 수행하는 경우 모든 요청에 ​​대해 XML 비 직렬화를 피할 수 있습니다. – manish

관련 문제