강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của kjkkmk423972118
kjkkmk423972118

câu hỏi đã được viết

Spring Boot JUnit Test - Ứng dụng ngân hàng sử dụng bảo mật

Tạo bộ điều khiển đăng ký tài khoản

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

Viết

·

279

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)

감사합니다.

spring-bootjunit소프트웨어-테스트

Câu trả lời 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으로 조회할 수 있는지 확인해 보시기 바랍니다. 오류가 발생하는 클래스와 메소드를 정확히 확인하고, 단위 테스트를 통해 이 부분이 정확히 동작하는지 먼저 확인하는 것이 좋겠습니다.

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

Hình ảnh hồ sơ của kjkkmk423972118
kjkkmk423972118

câu hỏi đã được viết

Đặt câu hỏi