Как сделать JUnitTest с помощью Spring Security - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть этот класс SpringSecurityWebAppConfig в этом проекте Demo.

Я создал библиотеку для повторного использования моей аутентификации и авторизации. Отсюда мой JwtAuthenticationFilter.

В моей библиотеке мой модульный тест для класса фильтра уже завершен. Так что, в моем Demo проекте, я все еще должен передать токен доступа? или я могу пропустить фильтр?

@Configuration
@EnableWebSecurity
public class SpringSecurityWebAppConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public JwtAuthenticationFilter jwtAuthenticationFilter;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf()
                .disable()
            .exceptionHandling()
                .authenticationEntryPoint(new CustomAuthenticationEntryPoint())
                .and()
            .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
            .addFilterAfter(jwtAuthenticationFilter, BasicAuthenticationFilter.class)
            .authorizeRequests()
                .antMatchers(HttpMethod.POST, "/v1/library/**").access("hasRole('ROLE_READER')")
                .and()
            .headers()
                .httpStrictTransportSecurity()
                .includeSubDomains(true).maxAgeInSeconds(31536000);
    }
}

JwtAuthenticationFilter в классе библиотеки:

public class JwtAuthenticationFilter extends OncePerRequestFilter {

    @Autowired
    private AuthenticationService authenticationService;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        getJwtFromRequest(request, response, filterChain);
    }

    private void getJwtFromRequest(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws  ServletException, IOException {

        String ipAddress = NetworkUtil.getClientIp(request);
        String requestUrl = request.getRequestURL().toString();

        String bearerToken = request.getHeader("Authorization");

        // Step 1: Check if bearer token exist in authorization header and if bearer token start with "Bearer "
        if (!StringUtils.hasText(bearerToken) || !bearerToken.startsWith("Bearer ")) {

            String errorMsg = "No access token found in request headers.";

            throw new AccessTokenMissingException(errorMsg);
        }

        // ... do other stuff here

    }
}

Контрольный пример:

@RunWith(SpringJUnit4ClassRunner.class)
@WebMvcTest(LibraryController.class)
public class LibraryControllerTest {

  @Autowired
  private WebApplicationContext context;

  @Autowired private MockMvc mockMvc;
  @MockBean private LibraryProfileService libraryProfileService;

  @Autowired
  private Filter springSecurityFilterChain;

  private ObjectMapper objectMapper;

  @Before
  public void setup() {
    objectMapper = new ObjectMapper();

    mockMvc = MockMvcBuilders
            .webAppContextSetup(context)
            .addFilters(springSecurityFilterChain)
            .build();

  }

  @Test
  @WithMockUser(roles={"READER"})
  public void Given_Library_When_Called_Then_ReturnData() throws Exception {

    final ResultActions resultActions =
        mockMvc
            .perform(get("/v1/library")
            .andExpect(status().isOk());

    final String contentAsString = resultActions.andReturn().getResponse().getContentAsString();
    final LibraryDto result =
        objectMapper.readValue(contentAsString, LibraryDto.class);

    assertNotNull(result);
    assertEquals(2, result.getTotal().getTotalElements());
  }
}

Журнал ошибок при выполнении теста:

com.appl.security.common.exception.AccessTokenMissingException: No access token found in request headers.

    at com.appl.security.common.filter.JwtAuthenticationFilter.getJwtFromRequest(JwtAuthenticationFilter.java:93)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...