Вот мой UserController:
@RestController
@RequestMapping(value = "/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping(value = "/current")
public User getUser(){
return userService.getCurrentUser();
}
}
Вот тест, который проверяет остальные конечные точки в контроллере.
@RunWith(SpringRunner.class)
@WebMvcTest(UserController.class)
public class UserControllerTest {
@Autowired
private MockMvc mvc;
@MockBean
private UserService userService;
@Test
public void getUser() throws Exception {
when(userService.getCurrentUser()).thenReturn(new User("Name", "LastName"));
mvc.perform(get("http://localhost:8080/users/current")).andDo(print()).andExpect(status().isOk())
.andExpect(jsonPath("$.response.firstName").value("Name"))
.andExpect(jsonPath("$.response.lastName").value("LastName"));
}
}
это тестовая работа. После этого добавляю springSecurity:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
А фильтр это:
public class ApiAuthenticationFilter extends OncePerRequestFilter {
private final RequestMatcher requestMatcher;
public ApiAuthenticationFilter() {
this.requestMatcher = new OrRequestMatcher(
new AntPathRequestMatcher("/users/**"));
}
@Override
protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException {
if (requestMatcher.matches(request)) {
return true;
}
return super.shouldNotFilter(request);
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
filterChain.doFilter(request, response);
}
}
и я добавляю конфигурацию:
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
ApiAuthenticationFilter authenticationFilter = new ApiAuthenticationFilter();
http.addFilterBefore(authenticationFilter, BasicAuthenticationFilter.class).csrf().disable();
}
}
Но сейчас тест не работает:
java.lang.AssertionError: Status
Expected :200
Actual :401
Но я поставил AntPathRequestMatcher("/users/**"))
http://localhost:8080/users/current
Это прекрасно работает в моем браузере, но тест не пройден с неавторизованным исключением. Что здесь не так?