如何在 Spring 安全 Java 配置中最好地组织 URL 授权

Abr*_*ler 5 security url spring authorization spring-security

我有一个声明了大量 URL 授权的应用程序。大概有200多个。我WebSecurityConfigurerAdapter按照 spring 安全文档的建议在 Java 配置中配置了这些。话虽如此,它们太多了,很难在一个类中维护它们。

我提出了一个目前正在运行的解决方案,但它的维护水平仍然不够理想。我想知道其他人是否遇到过这个问题以及您提出了哪些解决方案。

当前解决方案:

由于 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是将所有拆分的 URL 授权添加到 a 中,SortedSet并且通过让这些 URL 类扩展一个抽象类来维护订单,该抽象类将为它们提供顺序。这个定制器的用途WebSecurityConfigurerAdapter如下:

public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests(new UrlConfig())
            .formLogin()....
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

维持秩序的抽象类是UrlConfigSection. 保持顺序是为了something-something/**在更具体的something-something/somethingURL 路径之前不会选择更通用的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..
}
Run Code Online (Sandbox Code Playgroud)

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
    }
}
Run Code Online (Sandbox Code Playgroud)

这是 catch all URL 配置,注意它总是排在最后一个。其他 URL 类将有一个特定的编号。

目前这一切都在工作,但是由于类的排序,这有一定的维护方面。现在我需要跟踪数字以及将它们放置在排序集中的位置。有一个更好的方法吗?有没有人遇到过类似的问题,你是如何解决的?