2014-09-17 3 views
4

Spring MVC 4 애플리케이션에서 websocket 연결을 통해 호출 된 호출에서 메서드의 매개 변수로 this를 추가 할 때 java.security.Principal 객체를 얻을 수 있습니다.WebSocket 세션에서 UserDetails 객체에 액세스 Spring MVC

그러나이 basicly은 단지 그것의 이름을 가지고, 내가 로그인하는 동안 생성 된 (확장) UserDetails 객체가 필요합니다.

SecurityContextHolder.getContext().getAuthentication() 반환 null. Spring이 websocket 연결을 처리하기위한 특별한 세션을 만들기 때문에 이해했다.

질문 : websocket 세션/스레드 내부에서 securitycontext에 액세스하는 방법이 있습니까?

(세션 빈에 액세스 할 수 있으면 충분합니다.)

+0

기타 : 저는 Spring Session을 사용하여이 문제를 해결했습니다. http://projects.spring.io/spring-session/. webSockets 세션과 httpsession 사이의 매핑을 유지해야하기 때문에이 솔루션이 마음에 들지 않았습니다. 추악하고 불안정한 느낌이지만, 나는 그것을 작동시켜야했다. 보다 세련된 솔루션을 받으려면이 질문을 계속 열어 두십시오. – user2132072

답변

-1

나는 그것을 테스트하지했지만, 당신이 당신의 @MessageMapping 방법에

@AuthenticationPrincipal CustomUser customUser 

같은 매개 변수를 추가하여 사용자가 액세스 할 수 있어야합니다.

여기에서 자세한 내용을 찾을 수 있습니다

@Override 
public void afterConnectionEstablished (WebSocketSession session) throws Exception { 
    logger.info ("afterConnectionEstablished = " + session.getPrincipal()); 
} 
+0

흥미로운 주석 (존재 여부를 알지 못함). 그러나, 일할 수도 있습니다 : 나는 이것을 검증하기 위해 그것을 테스트 할 수 없다. – user2132072

0

난 당신이 AbstractWebSocketHandler

당신이 사용자 이름을 가질 수를 확장했다고 가정합니다. 다음과 같이

그러나, 당신은 당신의 @MessageMapping 주석 방법에 유형 java.security.Principle의 인수를 추가하고 그것에서 실제 UserDetails 객체를 취함으로써 아주 가까이 얻을 수 있습니다 :

FooUserDetails currentUser = (FooUserDetails) ((Authentication) user).getPrincipal(); 

이 봄 부팅 1.5 나를 위해 작동 .4

+0

onMessage (@MessageMapping 사용)에 의해 호출되는 메서드에서 필요합니다. – user2132072

관련 문제