Компонент AccessDecisionManager
, который вы регистрируете в .accessDecisionManager(...)
, совместно используется в вашем целом приложении Spring Security, поэтому в любое время необходимо принять решение об авторизации, то же самое UnanimousBased
Менеджер решений будет вызван, который в свою очередь вызывает вашего избирателя.
Так вот:
authorizeRequests()
.requestMatchers(getMatcherForAuthorities1and2Urls())
.hasAnyAuthority("AUTHORITY1", "AUTHORITY1");
вызовет тот же AccessDecisionManager
для "matcherForAuthorities1and2Urls"
как REGEX_PATTERN_URLS_THAT_NEED_AUTHORISATION
:
authorizeRequests()
.regexMatchers(REGEX_PATTERN_URLS_THAT_NEED_AUTHORISATION).authenticated()
.accessDecisionManager(myAccessDecisionManager());
Аналогично, включая http.authorizeRequests().anyRequest().authenticated()
зарегистрирует совпадение, которое соответствует каждому запросу, и запрашивает тот же AccessDecisionManager
для определения доступа.
Возможное решение
Возможно, один из способов достижения желаемого поведения - этопередайте REGEX_PATTERN_URLS_THAT_NEED_AUTHORISATION
в вашего собственного избирателя через его конструктор и используйте его для создания RequestMatcher
.Затем ваш избиратель может решить, будет ли он «голосовать» на основе запроса:
public int vote(Authentication authentication, FilterInvocation fi,
Collection<ConfigAttribute> attributes) {
if(!regexPatternMatcher.matches(fi.getRequest())) {
return ACCESS_ABSTAIN;
}
// ...
}