인프런 커뮤니티 질문&답변

kjkkmk42397님의 프로필 이미지
kjkkmk42397

작성한 질문수

스프링부트 JUnit 테스트 - 시큐리티를 활용한 Bank 애플리케이션

계좌등록 컨트롤러 만들기

JwtAuthorizationfilter test mvc.performget 관련 질문입니다!

작성

·

198

0

https://github.com/kimjeonggeon/bankapplication.git
2-bankapplication branch 입니다!

첫번 째 질문은 get 부분 urltemplate으로 받지 못합니다ㅜㅜ..

그리고 저번에 올렸던 질문인데 해결을 못해서요.. 그 이번에 accountcontroller 부분에서 로그인 확인을 postman을 통해 하는데 username을 보냈는데 로그인 실패 response로 안오고 error 만 뜹니다.


아래는 오류 코드 입니다.

감사합니다.
org.springframework.security.authentication.InternalAuthenticationServiceException: 인증 실패

at shop.mtcoding.bank.config.auth.LoginService.lambda������������������loadUserByUsername0(LoginService.java:23)

at java.base/java.util.Optional.orElseThrow(Optional.java:408)

at shop.mtcoding.bank.config.auth.LoginService.loadUserByUsername(LoginService.java:22)

at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:94)

at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:133)

at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:182)

at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:201)

at shop.mtcoding.bank.config.jwt.JwtAuthenticationFilter.attemptAuthentication(JwtAuthenticationFilter.java:50)

at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:227)

at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:217)

at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)

at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103)

at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89)

at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)

at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)

at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)

at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)

at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)

at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)

at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:112)

at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:82)

at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)

at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55)

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)

at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)

at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)

at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346)

at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:221)

감사합니다.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
kjkkmk42397님, JWT 토큰을 사용한 MockMvc 테스트와 관련하여 문제가 발생한 것으로 보이네요.

첫 번째 문제는 mvc.perform에서 특정 URL 템플릿을 받지 못한다는 것 같은데, 정확한 문제의 원인을 파악하기 위해서는 해당 코드의 전체적인 맥락과 구성이 중요합니다. 혹시 mvc.perform에 넘겨주는 URL이 올바른지, WebMvcTest 어노테이션을 사용하여 관련 컨트롤러가 올바르게 등록되었는지 확인해 보세요.

Spring Security 테스트와 관련하여, @WithMockUser를 사용하여 테스트를 진행하는 예제가 있습니다. @WebMvcTestMockMvc를 사용하여 인증된 사용자를 가정하고 테스트를 진행할 수 있습니다. 레퍼런스를 참고하여 테스트 구성을 맞춰보시기 바랍니다.

Java 예제:

import org.junit.jupiter.api.Test;
...
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.web.servlet.MockMvc;
...

@WebMvcTest(UserController.class)
class MySecurityTests {
...
    @Test
    @WithMockUser(roles = "ADMIN")
    void requestProtectedUrlWithUser() throws Exception {
        this.mvc.perform(get("/"));
    }
}

Kotlin 예제:

import org.junit.jupiter.api.Test
...
import org.springframework.security.test.context.support.WithMockUser
import org.springframework.test.web.servlet.MockMvc
...

@WebMvcTest(UserController::class)
class MySecurityTests(@Autowired val mvc: MockMvc) {

    @Test
    @WithMockUser(roles = ["ADMIN"])
    fun requestProtectedUrlWithUser() {
        mvc.perform(MockMvcRequestBuilders.get("/"))
    }
}

추가적인 정보는 Spring Security reference documentation에서 찾아보실 수 있습니다.

다음으로, 로그인 과정에서 발생하는 오류는 LoginServiceloadUserByUsername 메소드에서 발생한 것으로 보여집니다. 에러 메시지에 따르면 제공된 username에 해당하는 사용자를 찾지 못해 인증에 실패하였거나, 사용자 정보를 로드하는 과정에서 예외가 발생했을 수 있습니다. LoginService에서 username을 받아 사용자 정보를 로드하는 부분을 다시한번 확인해 보시고, Optional 사용 부분에서 예외 처리를 적절히 하고 있는지 검토해 보세요.

필요한 경우 실제 DB나 사용자 저장소에 해당 username으로 조회할 수 있는지 확인해 보시기 바랍니다. 오류가 발생하는 클래스와 메소드를 정확히 확인하고, 단위 테스트를 통해 이 부분이 정확히 동작하는지 먼저 확인하는 것이 좋겠습니다.

테스트코드 작성과 관련하여 도움이 필요하시다면, 자세한 문제 상황을 포함하여 다시 질문해 주시면 감사하겠습니다.

kjkkmk42397님의 프로필 이미지
kjkkmk42397

작성한 질문수

질문하기