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

최재영님의 프로필 이미지
최재영

작성한 질문수

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

시큐리티 JWT 코드 리뷰 및 개념잡기

권한처리를 위한 세션강제주입

해결된 질문

작성

·

310

·

수정됨

0

/api/admin 요청 시 권한만을 체크하기 위해 id 와 role 만 있는 객체를 시큐리티세션에 저장했다고 하셨는데

만약 username 이나 email 이 필요한 경우라면 그 로직도 BasicAuthenticationFilter 를 상속받은 필터에서 doFilterInternal() 메서드 안에서 강제주입을 할때 username 과 eamil을 가져와서 시큐리티 세션에 강제주입하는건가요 ?

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
네, 맞습니다. 만약 /api/admin 요청 시 사용자의 username이나 email과 같은 추가 정보가 필요하다면, BasicAuthenticationFilter를 상속받은 커스텀 필터의 doFilterInternal() 메서드에서 해당 정보를 가져와서 Spring Security의 세션에 강제로 주입할 수 있습니다. 이를 통해 권한 검사뿐만 아니라 필요한 정보를 세션에서 사용할 수 있게 됩니다.

참고로 @WithMockUser를 사용하여 테스트 환경에서는 특정 권한을 가진 가짜 사용자를 만들어 테스트를 수행할 수 있습니다. Spring Boot의 관련 문서에 나와 있는 예시를 살펴보면 테스트 코드에서 @WithMockUser(roles = "ADMIN") 어노테이션을 통해 ADMIN 역할을 가진 사용자를 테스트에 활용하는 것을 볼 수 있습니다.

Java 예시:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.web.servlet.MockMvc;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;

@WebMvcTest(UserController.class)
class MySecurityTests {

    @Autowired
    private MockMvc mvc;

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

}

Kotlin 예시:

import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest
import org.springframework.security.test.context.support.WithMockUser
import org.springframework.test.web.servlet.MockMvc
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders

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

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

}

추가적으로 테스팅에 대한 더 자세한 정보는 Spring Boot와 Spring Security의 참고 문서를 확인하시면 됩니다.
- Spring Boot 테스팅 가이드: Spring Boot Reference Documentation
- Spring Security 테스팅 지원: Spring Security Reference Documentation

최재영님의 프로필 이미지
최재영

작성한 질문수

질문하기