Skip to content

Commit 8e37583

Browse files
authored
✨ feat: 웹소켓 연결 시, 사용자 정보 주입 (#68)
* ✨ feat: 핸드쉐이크 추가 * ✨ feat: StompHeaderAccessor로 사용자 정보 추출 * chore: Java 스타일 수정 * ♻️ refactor: roomService에서 웹소켓을 통한 Player 객체 생성 로직 변경 * chore: Java 스타일 수정 * ♻️ refactor: roomServiceTests 로직 변경 * chore: Java 스타일 수정 * ♻️ refactor: authentication 추가 * chore: Java 스타일 수정 --------- Co-authored-by: github-actions <>
1 parent 704f643 commit 8e37583

File tree

4 files changed

+34
-10
lines changed

4 files changed

+34
-10
lines changed

backend/src/main/java/io/f1/backend/domain/game/app/RoomService.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import io.f1.backend.domain.question.entity.Question;
3838
import io.f1.backend.domain.quiz.app.QuizService;
3939
import io.f1.backend.domain.quiz.entity.Quiz;
40+
import io.f1.backend.domain.user.dto.UserPrincipal;
4041
import io.f1.backend.global.exception.CustomException;
4142
import io.f1.backend.global.exception.errorcode.RoomErrorCode;
4243

@@ -116,11 +117,12 @@ public void enterRoom(RoomValidationRequest request) {
116117
}
117118
}
118119

119-
public RoomInitialData initializeRoomSocket(Long roomId, String sessionId) {
120+
public RoomInitialData initializeRoomSocket(
121+
Long roomId, String sessionId, UserPrincipal principal) {
120122

121123
Room room = findRoom(roomId);
122124

123-
Player player = createPlayer();
125+
Player player = createPlayer(principal);
124126

125127
Map<String, Player> playerSessionMap = room.getPlayerSessionMap();
126128
Map<Long, String> userIdSessionMap = room.getUserIdSessionMap();
@@ -157,7 +159,7 @@ public RoomInitialData initializeRoomSocket(Long roomId, String sessionId) {
157159
systemNoticeResponse);
158160
}
159161

160-
public RoomExitData exitRoom(Long roomId, String sessionId) {
162+
public RoomExitData exitRoom(Long roomId, String sessionId, UserPrincipal principal) {
161163

162164
Object lock = roomLocks.computeIfAbsent(roomId, k -> new Object());
163165

@@ -166,7 +168,7 @@ public RoomExitData exitRoom(Long roomId, String sessionId) {
166168

167169
String destination = getDestination(roomId);
168170

169-
Player removePlayer = getRemovePlayer(room, sessionId);
171+
Player removePlayer = getRemovePlayer(room, sessionId, principal);
170172

171173
/* 방 삭제 */
172174
if (isLastPlayer(room, sessionId)) {
@@ -251,10 +253,10 @@ public RoundResult chat(Long roomId, String sessionId, ChatMessage chatMessage)
251253
.build();
252254
}
253255

254-
private Player getRemovePlayer(Room room, String sessionId) {
256+
private Player getRemovePlayer(Room room, String sessionId, UserPrincipal principal) {
255257
Player removePlayer = room.getPlayerSessionMap().get(sessionId);
256258
if (removePlayer == null) {
257-
room.removeUserId(getCurrentUserId());
259+
room.removeUserId(principal.getUserId());
258260
throw new CustomException(RoomErrorCode.SOCKET_SESSION_NOT_FOUND);
259261
}
260262
return removePlayer;
@@ -264,6 +266,10 @@ private static String getDestination(Long roomId) {
264266
return "/sub/room/" + roomId;
265267
}
266268

269+
private Player createPlayer(UserPrincipal principal) {
270+
return new Player(principal.getUserId(), principal.getUserNickname());
271+
}
272+
267273
private Player createPlayer() {
268274
return new Player(getCurrentUserId(), getCurrentUserNickname());
269275
}

backend/src/main/java/io/f1/backend/domain/game/websocket/GameSocketController.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,15 @@
1111
import io.f1.backend.domain.game.dto.RoundResult;
1212
import io.f1.backend.domain.game.dto.request.DefaultWebSocketRequest;
1313
import io.f1.backend.domain.game.dto.request.GameStartRequest;
14+
import io.f1.backend.domain.user.dto.UserPrincipal;
1415

1516
import lombok.RequiredArgsConstructor;
1617

1718
import org.springframework.messaging.Message;
1819
import org.springframework.messaging.handler.annotation.DestinationVariable;
1920
import org.springframework.messaging.handler.annotation.MessageMapping;
2021
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
22+
import org.springframework.security.core.Authentication;
2123
import org.springframework.stereotype.Controller;
2224

2325
@Controller
@@ -33,8 +35,10 @@ public void initializeRoomSocket(@DestinationVariable Long roomId, Message<?> me
3335

3436
String websocketSessionId = getSessionId(message);
3537

38+
UserPrincipal principal = getSessionUser(message);
39+
3640
RoomInitialData roomInitialData =
37-
roomService.initializeRoomSocket(roomId, websocketSessionId);
41+
roomService.initializeRoomSocket(roomId, websocketSessionId, principal);
3842
String destination = roomInitialData.destination();
3943

4044
messageSender.send(
@@ -51,8 +55,9 @@ public void initializeRoomSocket(@DestinationVariable Long roomId, Message<?> me
5155
public void exitRoom(@DestinationVariable Long roomId, Message<?> message) {
5256

5357
String websocketSessionId = getSessionId(message);
58+
UserPrincipal principal = getSessionUser(message);
5459

55-
RoomExitData roomExitData = roomService.exitRoom(roomId, websocketSessionId);
60+
RoomExitData roomExitData = roomService.exitRoom(roomId, websocketSessionId, principal);
5661

5762
String destination = roomExitData.getDestination();
5863

@@ -110,4 +115,10 @@ private static String getSessionId(Message<?> message) {
110115
StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
111116
return accessor.getSessionId();
112117
}
118+
119+
private static UserPrincipal getSessionUser(Message<?> message) {
120+
StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
121+
Authentication auth = (Authentication) accessor.getUser();
122+
return (UserPrincipal) auth.getPrincipal();
123+
}
113124
}

backend/src/main/java/io/f1/backend/global/config/WebSocketConfig.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
99
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
1010
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
11+
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
1112

1213
@Configuration
1314
@RequiredArgsConstructor
@@ -18,7 +19,9 @@ public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
1819

1920
@Override
2021
public void registerStompEndpoints(StompEndpointRegistry registry) {
21-
registry.addEndpoint("/ws/game-room").setAllowedOriginPatterns("*");
22+
registry.addEndpoint("/ws/game-room")
23+
.addInterceptors(new HttpSessionHandshakeInterceptor())
24+
.setAllowedOriginPatterns("*");
2225
}
2326

2427
@Override

backend/src/test/java/io/f1/backend/domain/game/app/RoomServiceTests.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import io.f1.backend.domain.game.model.RoomSetting;
1212
import io.f1.backend.domain.game.store.RoomRepository;
1313
import io.f1.backend.domain.quiz.app.QuizService;
14+
import io.f1.backend.domain.user.dto.UserPrincipal;
1415
import io.f1.backend.domain.user.entity.User;
1516
import io.f1.backend.global.util.SecurityUtils;
1617

@@ -29,6 +30,7 @@
2930

3031
import java.time.LocalDateTime;
3132
import java.util.ArrayList;
33+
import java.util.Collections;
3234
import java.util.List;
3335
import java.util.Optional;
3436
import java.util.concurrent.CountDownLatch;
@@ -142,9 +144,11 @@ void exitRoom_synchronized() throws Exception {
142144
executorService.submit(
143145
() -> {
144146
try {
147+
UserPrincipal principal =
148+
new UserPrincipal(user, Collections.emptyMap());
145149
SecurityUtils.setAuthentication(user);
146150
log.info("room.getHost().getId() = {}", room.getHost().getId());
147-
roomService.exitRoom(roomId, sessionId);
151+
roomService.exitRoom(roomId, sessionId, principal);
148152
} catch (Exception e) {
149153
e.printStackTrace();
150154
} finally {

0 commit comments

Comments
 (0)