Почему мой фильтр все еще вызывается на этой конечной точке, несмотря на web.ignoring().antMatchers()?

У меня есть конечная точка (GetMapping( "/testendpoint" )), которую я хочу оставить без работы фильтра проверки подлинности. Но что бы я ни делал, он все равно вызывает фильтр и отклоняет его как 401, так как в заголовке нет Jwt.

ПРИМЕЧАНИЕ. Фильтр вызывается только один раз.

Как сделать его незащищенным и не допустить вызова фильтра?

@EnableWebSecurity
@Import( { Config.class } )
@EnableConfigurationProperties( { JwtProperties.class } )
public class SecurityConfig extends WebSecurityConfigurerAdapter
{
    @Autowired
    private JwtProperties jwtProperties;

    @Override
    public void configure(WebSecurity web) throws Exception
    {
        web.ignoring()
            .antMatchers( "/swagger-ui.html" ) //This goes through without security
            .antMatchers( "/metrics" ) //This calls the filter
            .antMatchers( "/testendpoint" ); //This calls the filter
    }


    @Override
    protected void configure(HttpSecurity http) throws Exception
    {
        JWTAuthenticationFilter jwtAuthenticationFilter = new JWTAuthenticationFilter( jwtProperties );
        ExceptionHandlerFilter exceptionHandlerFilter = new ExceptionHandlerFilter();
        http.csrf().disable().authorizeRequests()
            .antMatchers( "/" ).permitAll()
            .antMatchers( "/testendpoint" ).permitAll() //Doesn't stop the filter
            .and()
            .addFilterAfter( jwtAuthenticationFilter, BasicAuthenticationFilter.class )
            .addFilterBefore( exceptionHandlerFilter, JWTAuthenticationFilter.class );
            /* Adding the below also did not work
            .authorizeRequests()
            .antMatchers( "/testendpoint/**" ).permitAll();
            */
    }
}

Моя конечная точка является конечной точкой привода:

@Configuration
@ManagementContextConfiguration
@CacheController
public class TestController extends AbstractMvcEndpoint
{
    @GetMapping( value = "/testendpoint", produces = MediaType.APPLICATION_JSON_UTF8_VALUE )
    public String getSomething(HttpServletRequest request) throws Exception
    {
        return "hello";
    }
}

person Don Rhummy    schedule 26.01.2018    source источник
comment
Попробуйте web.ignoring().antMatchers( "/swagger-ui.html", "/metrics", "/testendpoint");   -  person Ritesh    schedule 27.01.2018
comment
@Ritesh Это не исправило   -  person Don Rhummy    schedule 27.01.2018
comment
@dur Это все еще не мой ответ. Проблема в том, что он выдает неавторизованное исключение, хотя должен разрешить мой /testendpoint. Это проблема, о которой я спрашиваю.   -  person Don Rhummy    schedule 27.01.2018
comment
@DonRhummy: Пожалуйста, прочитайте другой вопрос и сделайте это, как в принятом ответе. Конечно, ваш фильтр выдает исключение, потому что он вообще не должен выполняться.   -  person dur    schedule 27.01.2018


Ответы (1)


Если у вас есть конечная точка, которая только что использовалась во время тестирования, просто поместите ее в src/test/java вместо src/main/java. Таким образом, он будет автоматически подключен только на этапе тестирования и не будет присутствовать в рабочем коде.

Таким образом, вы можете пропустить настройку игнорирования в конфигурации безопасности рабочей среды spring.

person luboskrnac    schedule 26.01.2018
comment
Он используется во время обычного выполнения, а не только в тестах. - person Don Rhummy; 27.01.2018