Как смоделировать SpringSecurity и OncePerRequestFilter (фильтр аутентификации JWT), чтобы получить @AuthenticationPrincipal? - PullRequest
0 голосов
/ 07 мая 2018

Может кто-нибудь сказать мне, как смоделировать SpringSecurity и OncePerRequestFilter (фильтр аутентификации JWT)?

В Интернете есть примеры, но что-то я не могу собрать все вместе.

Итак, есть SpringBoot 2.0. Пользователь @AuthenticationPrincipal является параметром функции.

Существует расширение JWtFilter OncePerRequestFilter, которое проверяет действительность токена jwt.

Необходимый

@SpringBootTest(
    webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
    classes = NfaBackendApplication.class)
@TestExecutionListeners({
    DependencyInjectionTestExecutionListener.class,
    DirtiesContextTestExecutionListener.class,
    WithSecurityContextTestExecutionListener.class })
public class OfferControllerTest extends AbstractTestNGSpringContextTests
{

    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext context;

    @MockBean
    private UserRepository kvUserRepository;

    @InjectMocks
    private JWTAuthenticationFilter jwtAuthenticationFilter = new JWTAuthenticationFilter();

    @Mock
    private JWTokenProvider jwtTokenProvider;

    @BeforeClass
    public void setUp() throws ServletException, IOException
    {
        mockMvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity())
            .build();
        MockitoAnnotations.initMocks(this);
    }

    @Test(enabled = true)
    public void getExternalOffers() throws Exception
    {

//        KVUserDetails user = new KVUserDetails("mail@mail.ua", "test", false, true, AuthorityUtils
//            .createAuthorityList("ADMIN"));
//        TestingAuthenticationToken testingAuthenticationToken = new TestingAuthenticationToken(user, null);
//        SecurityContextHolder.getContext().setAuthentication(testingAuthenticationToken);

        MockFilterChain filterChain = new MockFilterChain();
        MockHttpServletRequest request = new MockHttpServletRequest();
        request.addHeader(HttpHeaders.AUTHORIZATION,"Authorized");
        MockHttpServletResponse response = new MockHttpServletResponse();
        when(jwtTokenProvider.validateToken("Authorized")).thenReturn(true);

        mockMvc.perform(get("/admin/offers")
            .accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk());
    }

Подскажите пожалуйста рабочий пример, как намочить SpringSecurity и OncePerRequestFilter (JWT Authentication Filter)?

что на запрос придет пользователь, который AuthenticationPrincipal.

Спасибо.

1 Ответ

0 голосов
/ 07 мая 2018

Вы можете использовать @WithUserDetails для инициализации пользователя для теста MockMvc. Не нужно издеваться над сервлетным фильтром.

Примерно так:

@Test(enabled = true)
@WithUserDetails("mail@mail.ua")
public void getExternalOffers() throws Exception
{
...