У меня есть приложение с объявленным большим количеством авторизаций URL. Вероятно, более 200 из них. Я настроил их с WebSecurityConfigurerAdapter
в Java config в соответствии с рекомендациями весенней документации по безопасности. При этом их так много, что становится трудно поддерживать их в одном классе.
Я нашел решение, которое работает в настоящее время, но уровень обслуживания для него все еще остается. это не идеально. Я хотел бы знать, сталкивались ли другие с этой проблемой и какие решения вы нашли.
Текущее решение:
Поскольку существует так много URL-адресов, Я разделил их на несколько классов следующим образом:
public class UrlConfig implements Customizer<ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry> {
@Override
public void customize(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry requests) {
buildUrlPartition().stream().forEachOrdered(config -> config.configure(requests));
}
SortedSet<UrlConfigSection> buildUrlPartition() {
SortedSet<UrlConfigSection> urlPartition = new TreeSet<>();
urlPartition.add(new CustomUrlsConfig());
urlPartition.add(new DeleteUrlsConfig());
urlPartition.add(new AddUrlsConfig());
urlPartition.add(new EditUrlsConfig());
urlPartition.add(new ListUrlsConfig());
urlPartition.add(new CatchAllUrlsConfig());
return urlPartition;
}
}
Это добавляет все полномочия разделения URL-адресов в SortedSet
, и порядок поддерживается за счет того, что эти классы URL-адресов расширяют абстрактный класс, который придает им порядок , Этот настройщик используется в WebSecurityConfigurerAdapter
следующим образом:
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests(new UrlConfig())
.formLogin()....
...
}
}
Абстрактный класс, поддерживающий порядок: UrlConfigSection
. Порядок поддерживается таким образом, что более общие c URL something-something/**
пути не будут выбраны раньше, чем более конкретные c something-something/something
пути URL.
public abstract class UrlConfigSection implements Comparable<UrlConfigSection> {
public abstract Integer getOrder();
public abstract void configure(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry requests);
public int compareTo(UrlConfigSection urlPartition) {
return this.getOrder().compareTo(urlPartition.getOrder());
}
... // implements the equals and hashcode methods. etc..
}
Пример класса URL следующий:
public class CatchAllUrlsConfig extends UrlConfigSection {
@Override
public Integer getOrder() {
return Integer.MAX_VALUE; // this is so that it's always sorted as the last "catch all" urls.
}
@Override
public void configure(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry requests) {
requests.antMatchers("sample url...").hasAnyAuthority("SOMEROLE");
..... // more declarations
}
}
Это конфигурация перехвата всех URL, обратите внимание, что она всегда будет сортироваться как последняя. Другие классы URL будут иметь определенный номер c.
В настоящее время все это работает, однако есть определенный аспект обслуживания из-за упорядочения классов. Теперь мне нужно отслеживать номера и их расположение в отсортированном наборе. Есть лучший способ сделать это? Кто-нибудь сталкивался с подобной проблемой и как вы ее решили?