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

Я использую spring-boot-starter-security это автоматически обеспечивает все мои @GetMapping остальные конечные точки по умолчанию.

Вопрос: как я могу указать только белый список подпути, который не должен быть защищен?

Я попытался следующим образом:

@Configuration
public class DocumentsSecurityConfiguration implements WebSecurityConfigurer<WebSecurity> {
    @Override
    public void init(WebSecurity builder) { }

    //should allow unauthenticated access
    @Override
    public void configure(WebSecurity web) {
        web.ignoring().antMatchers("/documents/**");
    }
}

Но localhost:8080/documents корневой путь должен оставаться защищенным. Только подпути как /documents/123 должен оставаться открытым.

Проблема: когда я теперь получаю доступ к корневому пути /documents, это не обеспечено больше.

Мой AntMatcher неправильно?

2 ответа

Такое поведение является оптимизацией, см. AntPathRequestMatcher:

Используя значение шаблона /** или же ** рассматривается как универсальное совпадение, которое будет соответствовать любому запросу. Шаблоны, которые заканчиваются /** (и не имеют других подстановочных знаков) оптимизируются с помощью совпадения подстроки - шаблон /aaa/** будет соответствовать /aaa, /aaa/ и любые подкаталоги, такие как /aaa/bbb/ccc,

Есть несколько возможных способов решить вашу проблему:

  • использование RegexRequestMatcher
  • реализовать обычай RequestMatcher
  • использование NegatedRequestMatcher

Я думаю, что-то вроде этого:

@Configuration
@EnableWebSecurity
@Order(SecurityProperties.BASIC_AUTH_ORDER)
@Slf4j
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private static final String[] AUTH_WHITE_LIST = {
        // swagger-ui
          "/v2/api-docs"
        , "/swagger-resources"
        , "/swagger-resources/**"
        , "/configuration/security"
        , "/swagger-ui.html"
        , "/webjars/**"
        , "/security/**"
        // spring actuator
        , "/actuator"
        , "/actuator/**"
    };

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.anonymous().and()
                .authorizeRequests().antMatchers(AUTH_WHITE_LIST).permitAll();
    }
}

И, пожалуйста, позаботьтесь о Порядке, весенняя безопасность основана на файлах, и в основном порядок важен. Если какой-либо другой сопоставитель отклонит запрос, он не будет доставлен в этот конфиг.

Для проблемы, которую вы упомянули,

Я думаю, что вы должны написать собственный фильтр, чтобы справиться с этим. разрешить только "/ Documents" с некоторым дополнительным путем, но прекратить доступ к "/ Documents".

Я лично предлагаю вам изменить дизайн URL-адреса, может быть, в этой ситуации изменить его на "/ documents / all" лучше, чем "/ documents"? хотя это немного против остальных учебных пособий в Интернете.

Код взят из одного моего проекта, но некоторая не относительная часть была удалена. Надеюсь, что это может помочь.

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