Skip to content

Commit 12b8d82

Browse files
committed
fix: security context를 session에 담아 filter chain으로 인한 401 문제 해결
1 parent 64145fb commit 12b8d82

File tree

2 files changed

+33
-7
lines changed

2 files changed

+33
-7
lines changed

backend/src/main/java/io/f1/backend/domain/user/app/TestUserService.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import lombok.RequiredArgsConstructor;
1515

1616
import org.springframework.context.annotation.Profile;
17+
import org.springframework.security.core.context.SecurityContext;
18+
import org.springframework.security.core.context.SecurityContextHolder;
1719
import org.springframework.stereotype.Service;
1820
import org.springframework.transaction.annotation.Transactional;
1921

@@ -30,7 +32,9 @@ public void login(Long userId, HttpSession session) {
3032
userRepository
3133
.findById(userId)
3234
.orElseThrow(() -> new CustomException(UserErrorCode.USER_NOT_FOUND));
33-
session.setAttribute(USER, AuthenticationUser.from(user));
35+
3436
SecurityUtils.setAuthentication(user);
37+
SecurityContext context = SecurityContextHolder.getContext();
38+
session.setAttribute("SPRING_SECURITY_CONTEXT", context);
3539
}
3640
}

backend/src/test/java/io/f1/backend/domain/user/TestUserBrowserTest.java

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,27 @@
33
import static io.f1.backend.domain.user.constants.SessionKeys.USER;
44

55
import static org.assertj.core.api.Assertions.assertThat;
6+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
67
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
78
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
89

910
import com.github.database.rider.core.api.dataset.DataSet;
1011

1112
import io.f1.backend.domain.user.dto.AuthenticationUser;
13+
import io.f1.backend.domain.user.dto.UserPrincipal;
1214
import io.f1.backend.global.template.BrowserTestTemplate;
1315

1416
import org.junit.jupiter.api.DisplayName;
1517
import org.junit.jupiter.api.Test;
1618
import org.springframework.mock.web.MockHttpSession;
19+
import org.springframework.security.core.context.SecurityContext;
1720
import org.springframework.test.web.servlet.ResultActions;
1821

1922
public class TestUserBrowserTest extends BrowserTestTemplate {
2023

2124
@Test
2225
@DataSet("datasets/user.yml")
23-
@DisplayName("테스트 유저가 로그인하면 세션에 유저 정보가 저장된다")
26+
@DisplayName("테스트 유저가 로그인하면 세션에 SecurityContext가 저장된다")
2427
void testUserLogin() throws Exception {
2528
// given
2629
MockHttpSession session = new MockHttpSession();
@@ -30,11 +33,30 @@ void testUserLogin() throws Exception {
3033

3134
// then
3235
result.andExpect(status().isOk());
33-
assertThat(session.getAttribute(USER)).isNotNull();
36+
assertThat(session.getAttribute("SPRING_SECURITY_CONTEXT")).isNotNull();
37+
38+
SecurityContext context = (SecurityContext) session.getAttribute("SPRING_SECURITY_CONTEXT");
39+
assertThat(context.getAuthentication().getPrincipal()).isInstanceOf(UserPrincipal.class);
40+
41+
UserPrincipal userPrincipal = (UserPrincipal) context.getAuthentication().getPrincipal();
42+
assertThat(userPrincipal.getUserId()).isEqualTo(1L);
43+
assertThat(userPrincipal.getUserNickname()).isEqualTo("USER1");
44+
}
45+
46+
@Test
47+
@DataSet("datasets/stat/one-user-stat.yml")
48+
@DisplayName("테스트 유저가 로그인하면 마이페이지에 접근이 가능하다")
49+
void testUserLoginSecurityContext() throws Exception {
50+
// given
51+
MockHttpSession session = new MockHttpSession();
52+
53+
// when
54+
ResultActions beforeLogin = mockMvc.perform(get("/user/me").session(session));
55+
mockMvc.perform(post("/user/test/login/1").session(session));
56+
ResultActions afterLogin = mockMvc.perform(get("/user/me").session(session));
3457

35-
AuthenticationUser authenticationUser = (AuthenticationUser) session.getAttribute(USER);
36-
assertThat(authenticationUser.userId()).isEqualTo(1L);
37-
assertThat(authenticationUser.nickname()).isEqualTo("USER1");
38-
assertThat(authenticationUser.providerId()).isEqualTo("kakao1");
58+
// then
59+
beforeLogin.andExpect(status().isUnauthorized());
60+
afterLogin.andExpect(status().isOk());
3961
}
4062
}

0 commit comments

Comments
 (0)