Как лучше всего организовать авторизацию URL в настройках Spring security Java - PullRequest
3 голосов
/ 28 апреля 2020

У меня есть приложение с объявленным большим количеством авторизаций 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.

В настоящее время все это работает, однако есть определенный аспект обслуживания из-за упорядочения классов. Теперь мне нужно отслеживать номера и их расположение в отсортированном наборе. Есть лучший способ сделать это? Кто-нибудь сталкивался с подобной проблемой и как вы ее решили?

...