Как внести в белый список только подпуть защищенного пути весной?
Я использую 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"? хотя это немного против остальных учебных пособий в Интернете.
Код взят из одного моего проекта, но некоторая не относительная часть была удалена. Надеюсь, что это может помочь.