Код: Выделить всё
public class WithMockCustomUserSecurityContextFactory
implements WithSecurityContextFactory {
private UserDetailsService userDetailsService;
@Autowired
public WithMockCustomUserSecurityContextFactory(UserDetailsService userDetailsService) {
this.userDetailsService = userDetailsService;
}
@Override
public SecurityContext createSecurityContext(WithMockUser customUser) {
var context = SecurityContextHolder.createEmptyContext();
var principal = userDetailsService.loadUserByUsername(customUser.username());
var authentication = new UsernamePasswordAuthenticationToken(principal, principal.getPassword(), principal.getAuthorities());
context.setAuthentication(authentication);
return context;
}
}
@Retention(RetentionPolicy.RUNTIME)
@WithSecurityContext(factory = WithMockCustomUserSecurityContextFactory.class)
public @interface WithMockUser {
String username() default "username";
String password() default "password";
}
< /code>
После выхода из этого установлен аутентификация в держателе контекста, но когда тогда запрос запускается в тесте: < /p>
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("test")
public class BookControllerIntegrationTest {
@Test
@DisplayName("GIVEN a valid BookRequest WHEN createBook THEN a valid BookResponse is returned")
@WithMockUser
void createBookCreated() throws Exception {
var bookRequest = new BookRequest();
bookRequest.setBookType(BookType.NEW_RELEASE);
bookRequest.setAuthor("Author");
bookRequest.setIsbn("1");
bookRequest.setTitle("title");
bookRequest.setBasePrice(15.4);
HttpEntity entity = new HttpEntity(jacksonObjectMapper.writeValueAsString(bookRequest), headers);
ResponseEntity response = restTemplate.exchange(createURLWithPort("/books"), HttpMethod.POST, entity,
BookResponse.class);
Assertions.assertEquals(HttpStatus.CREATED, response.getStatusCode());
}
...
< /code>
Когда я останавливаюсь с отладчиком в моем фильтре: < /p>
@Override
protected void doFilterInternal(@NonNull HttpServletRequest request,
@NonNull HttpServletResponse response,
@NonNull FilterChain filterChain)
throws ServletException, IOException {
var authHeader = request.getHeader("Authorization");
if (authHeader == null || !authHeader.startsWith("Bearer ")) {
filterChain.doFilter(request, response);
return;
}
var token = authHeader.substring(7);
if (jwtUtil.validateToken(token)) {
String username = jwtUtil.extractUsername(token);
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
UsernamePasswordAuthenticationToken authToken =
new UsernamePasswordAuthenticationToken(
userDetails, null, userDetails.getAuthorities()
);
authToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authToken);
}
filterChain.doFilter(request, response);
}
Подробнее здесь: https://stackoverflow.com/questions/795 ... getcontext