Веб-безопасность SpringBoot не игнорирует URL-адрес, если у него есть параметры

Я пытался игнорировать URL-адрес WebSecurity в SpringBoot. Смог сделать это для точного совпадения URL. Но если в самом URL-адресе есть параметр, он не может его игнорировать. Есть ли лучший способ игнорировать URL-адрес, например игнорировать конкретный контроллер. А если нет, то как обойти параметры?

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/api/v1/something");
    // was able to ignore [url]/api/v1/something but not [url]/api/v1/something?xyz=wjsbjbjbsjbw
}

Добавьте "*" к своему URL-адресу, и он будет работать на вас.

Kunal Vohra 15.03.2019 07:53
1
1
1 791
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Попробуйте с подстановочными знаками.

web.ignoring().antMatchers("/api/v1/something/**");

не получилось, но спасибо. Тем не менее /api/v1/something игнорируется, но не с параметрами

Mukarram Ali 11.03.2019 21:19

Попробуйте использовать HttpSecurity

@Override
public void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("/api/v1/something/**").permitAll();
}

Это должно сработать для вас.

[url]/api/v1/something?xyz=wjsbjbjbsjbw

заменить, как показано ниже "wjsbjbjbsjbw" = *

SO новый URL будет

[url]/api/v1/something?xyz=*

Каждое значение после / можно рассматривать как *.

Я не уверен, что something еще вы можете сделать это * также

Или наоборот, который определенно сработает,

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("[url]/api/v1");
}

Подробнее см. Образцы безопасности Spring.

Вы можете использовать regexmatchers для того же.

public void configure(WebSecurity web) throws Exception {
      web.ignoring().regexMatchers("/api/v1/something.*");
}

Вы должны достичь своей цели, если добавите звездочки (*) после вашей текущей спецификации antMatcher.

По определению:

The mapping matches URLs using the following rules:

  • ? matches one character
  • * matches zero or more characters
  • ** matches zero or more directories in a path
  • {spring:[a-z]+} matches the regexp [a-z]+ as a path variable named "spring"

Важный фрагмент кода может выглядеть так:

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/api/v1/something*");
}

Вы также можете добиться того же, используя другой перегруженный метод configure с параметром типа HttpSecurity для конфигураций безопасности, связанных с путем, который будет выглядеть следующим образом:

@Override
public void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().antMatchers("/api/v1/something*").permitAll();
}

Как указано в определении, вы также можете сделать еще один шаг и разрешить все, что ниже этого пути, при завершении вашего AntMatcher с помощью /**. Но это действительно зависит от вашего варианта использования. Подробности реализации смотрите в Spring AntPathRequestMatcher


Соответствующее сопоставление запросов должно выглядеть следующим образом (пример с @GetMapping). Важно, чтобы на вашем пути не было следов /.

@GetMapping("/api/v1/something")
public ResponseEntity<String> getSomething(@RequestParam(value = "xyz", required = false) String xyz){
    return ResponseEntity.ok("Called with xyz param: " + xyz);
}
Ответ принят как подходящий

web.ignoring().antMatchers("/api/v1/something/**"); должно работать нормально, но проверьте, включили ли вы web.ignoring().antMatchers("/error/**");, так как я сталкивался с подобной проблемой ранее, конечные точки ошибок также аутентифицируются. надеюсь это поможет.

Это была проблема, я попытался отладить код. Ошибка возникла из-за другого кода.

Mukarram Ali 18.03.2019 10:20

Другие вопросы по теме