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