Skip to content

Commit 9ba2544

Browse files
committed
웹소켓
1 parent 5cfdf94 commit 9ba2544

File tree

4 files changed

+66
-29
lines changed

4 files changed

+66
-29
lines changed

src/main/java/com/oronaminc/join/websocket/api/QuestionWebsocketController.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66
import org.springframework.messaging.handler.annotation.MessageMapping;
77
import org.springframework.messaging.handler.annotation.Payload;
88
import org.springframework.messaging.handler.annotation.SendTo;
9+
import org.springframework.security.core.Authentication;
910
import org.springframework.stereotype.Controller;
1011

1112
import com.oronaminc.join.global.exception.ErrorCode;
1213
import com.oronaminc.join.global.exception.ErrorException;
1314
import com.oronaminc.join.global.ratelimit.RateLimitService;
1415
import com.oronaminc.join.global.ratelimit.RateLimitType;
16+
import com.oronaminc.join.member.security.MemberDetails;
1517
import com.oronaminc.join.question.domain.Question;
1618
import com.oronaminc.join.question.dto.QuestionCreateResponse;
1719
import com.oronaminc.join.question.dto.QuestionDeleteResponse;
@@ -42,7 +44,8 @@ public QuestionCreateResponse createQuestion(
4244
) {
4345
log.debug("수신한 메시지 = {}", request.content());
4446

45-
Long memberId = Long.valueOf(principal.getName());
47+
MemberDetails memberDetails = (MemberDetails)((Authentication)principal).getPrincipal();
48+
Long memberId = Long.valueOf(memberDetails.getId());
4649

4750
log.debug("회원 아이디 = {}", memberId);
4851

@@ -66,6 +69,7 @@ public QuestionUpdateResponse updateQuestion(
6669
@Payload @Valid QuestionRequest request,
6770
Principal principal
6871
) {
72+
6973
Long memberId = Long.valueOf(principal.getName());
7074

7175
Question updated = questionService.update(memberId, roomId, questionId, request);
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.oronaminc.join.websocket.config;
2+
3+
import org.springframework.messaging.Message;
4+
import org.springframework.messaging.MessageChannel;
5+
import org.springframework.messaging.simp.stomp.StompCommand;
6+
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
7+
import org.springframework.messaging.support.ChannelInterceptor;
8+
import org.springframework.messaging.support.MessageHeaderAccessor;
9+
import org.springframework.security.core.Authentication;
10+
import org.springframework.security.core.context.SecurityContextHolder;
11+
import org.springframework.stereotype.Component;
12+
13+
@Component
14+
public class StompAuthChannelInterceptor implements ChannelInterceptor {
15+
@Override
16+
public Message<?> preSend(Message<?> message, MessageChannel channel) {
17+
StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
18+
19+
if (StompCommand.CONNECT.equals(accessor.getCommand())) {
20+
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
21+
22+
if (authentication != null && authentication.isAuthenticated()) {
23+
accessor.setUser(authentication);
24+
}
25+
}
26+
27+
return message;
28+
}
29+
}

src/main/java/com/oronaminc/join/websocket/config/WebSocketConfig.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
import org.springframework.context.ApplicationEventPublisher;
44
import org.springframework.context.annotation.Bean;
55
import org.springframework.context.annotation.Configuration;
6+
import org.springframework.messaging.simp.config.ChannelRegistration;
67
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
78
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
89
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
910
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
1011
import org.springframework.web.socket.config.annotation.WebSocketTransportRegistration;
1112
import org.springframework.web.socket.handler.WebSocketHandlerDecoratorFactory;
12-
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
1313

1414
import com.oronaminc.join.websocket.handshake.CustomHandshakeHandler;
1515
import com.oronaminc.join.websocket.session.CustomWebSocketHandlerDecorator;
@@ -27,6 +27,7 @@ public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
2727
private final StompErrorHandler stompErrorHandler;
2828
private final WebsocketSessionManager sessionManager;
2929
private final ApplicationEventPublisher publisher;
30+
private final StompAuthChannelInterceptor stompAuthChannelInterceptor;
3031

3132
@Bean
3233
public WebSocketHandlerDecoratorFactory webSocketHandlerDecoratorFactory(
@@ -48,15 +49,15 @@ public void registerStompEndpoints(StompEndpointRegistry registry) {
4849
registry.addEndpoint("/ws")
4950
.setAllowedOriginPatterns("*")
5051
// websocket 연결 전 쿠키 체크
51-
.addInterceptors(new HttpSessionHandshakeInterceptor())
52+
// .addInterceptors(new HttpSessionHandshakeInterceptor())
5253
// websocket 연결 후 principal 생성
53-
.setHandshakeHandler(handshakeHandler)
54+
// .setHandshakeHandler(handshakeHandler)
5455
.withSockJS();
5556

5657
registry.addEndpoint("/ws")
5758
.setAllowedOriginPatterns("*")
58-
.addInterceptors(new HttpSessionHandshakeInterceptor())
59-
.setHandshakeHandler(handshakeHandler)
59+
// .addInterceptors(new HttpSessionHandshakeInterceptor())
60+
// .setHandshakeHandler(handshakeHandler)
6061
;
6162

6263
registry.setErrorHandler(stompErrorHandler);
@@ -66,4 +67,9 @@ public void registerStompEndpoints(StompEndpointRegistry registry) {
6667
public void configureWebSocketTransport(WebSocketTransportRegistration registry) {
6768
registry.setDecoratorFactories(webSocketHandlerDecoratorFactory(sessionManager, publisher));
6869
}
70+
71+
@Override
72+
public void configureClientInboundChannel(ChannelRegistration registration) {
73+
registration.interceptors(stompAuthChannelInterceptor);
74+
}
6975
}

src/main/java/com/oronaminc/join/websocket/session/CurrentParticipantEventHandler.java

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@
66
import java.util.Set;
77

88
import org.springframework.context.event.EventListener;
9-
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
109
import org.springframework.stereotype.Component;
11-
import org.springframework.web.socket.messaging.SessionSubscribeEvent;
1210

1311
import com.oronaminc.join.global.exception.ErrorException;
1412
import com.oronaminc.join.room.event.RoomExitEvent;
@@ -23,27 +21,27 @@ public class CurrentParticipantEventHandler {
2321
private static final String ROOM_PREFIX = "/topic/rooms/";
2422
private static final String JOIN_SUFFIX = "/join";
2523

26-
@EventListener
27-
public void handleSubscribe(SessionSubscribeEvent event) {
28-
StompHeaderAccessor accessor = StompHeaderAccessor.wrap(event.getMessage());
29-
String destination = accessor.getDestination();
30-
Principal principal = accessor.getUser();
31-
32-
if (destination == null) {
33-
throw new ErrorException(STOMP_INVALID_DESTINATION);
34-
}
35-
36-
if (!destination.startsWith(ROOM_PREFIX)) {
37-
return;
38-
}
39-
40-
Long memberId = parseMemberId(principal);
41-
Long roomId = parseRoomId(destination);
42-
43-
if (!isRoomJoinPath(destination)) {
44-
validateParticipantRoomJoin(roomId, memberId);
45-
}
46-
}
24+
// @EventListener
25+
// public void handleSubscribe(SessionSubscribeEvent event) {
26+
// StompHeaderAccessor accessor = StompHeaderAccessor.wrap(event.getMessage());
27+
// String destination = accessor.getDestination();
28+
// Principal principal = accessor.getUser();
29+
//
30+
// if (destination == null) {
31+
// throw new ErrorException(STOMP_INVALID_DESTINATION);
32+
// }
33+
//
34+
// if (!destination.startsWith(ROOM_PREFIX)) {
35+
// return;
36+
// }
37+
//
38+
// Long memberId = parseMemberId(principal);
39+
// Long roomId = parseRoomId(destination);
40+
//
41+
// if (!isRoomJoinPath(destination)) {
42+
// validateParticipantRoomJoin(roomId, memberId);
43+
// }
44+
// }
4745

4846
@EventListener
4947
public void handleUnsubscribe(RoomExitEvent event) {

0 commit comments

Comments
 (0)