spring - Spring Security 向所有端点添加过滤器,除了一个
问题描述
我对此进行了研究,并在 SO 上找到了这个答案。
但是,我确实对此有补充问题:
我有一组过滤器,我想将其应用于所有请求,除了特殊情况(例如:除 /mgmt/** 和 /error/** 之外的所有路径)。
这不能使用链接答案中提供的相同方法来完成,因为我会将过滤器添加到默认的 http-security 对象,然后它也适用于特殊情况。
有没有像“负匹配器”这样的东西,让我可以做类似的事情:
http.negativeAntMatchers("/mgmt/**).addFilter(...)
为除 /mgmt/** 之外的所有内容添加过滤器?
我的代码:
这是“/mgmt”的配置,将 ManagementBasicAuthFilter 放在链中 - 这很有效,因为除了“/mgmt/**”之外没有端点要求基本身份验证。
@Order(1)
@Configuration
@RequiredArgsConstructor
public static class ManagementSecurityConfig extends WebSecurityConfigurerAdapter {
private final AuthenticationManager authenticationManager;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.antMatcher("mgmt/**")
.csrf().disable()
.headers().frameOptions().sameOrigin()
.cacheControl().disable()
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.addFilterBefore(new ManagementBasicAuthenticationFilter(authenticationManager,
getAuthenticationEntryPoint(), "/mgmt"), BasicAuthenticationFilter.class)
.authorizeRequests()
.anyRequest()
.permitAll();
}
private BasicAuthenticationEntryPoint getAuthenticationEntryPoint() {
BasicAuthenticationEntryPoint entryPoint = new BasicAuthenticationEntryPoint();
entryPoint.setRealmName("myApp");
return entryPoint;
}
}
这是所有入口点的配置,除了 mgmt - 此文件中的所有过滤器都不应应用于 /mgmt/**
@Order(2)
@Configuration
@RequiredArgsConstructor
@Import({ ResourceServerTokenServicesConfiguration.class })
@EnableOAuth2Client
public static class OAuthSecurityConfig extends WebSecurityConfigurerAdapter {
private final OAuth2ClientContextFilter clientContextFilter;
private final OAuth2ClientAuthenticationProcessingFilter ssoFilter;
private final StatePropagatingLoginRedirectFilter statePropagatingLoginRedirectFilter;
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers("/mgmt/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.headers().frameOptions().sameOrigin()
.cacheControl().disable()
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.exceptionHandling()
.defaultAuthenticationEntryPointFor(
new LoginUrlAuthenticationEntryPoint("/login"),
request -> true)
.and()
.addFilterAfter(statePropagatingLoginRedirectFilter, AbstractPreAuthenticatedProcessingFilter.class)
.addFilterAfter(ssoFilter, statePropagatingLoginRedirectFilter.getClass())
.addFilterAfter(clientContextFilter, ssoFilter.getClass())
.authorizeRequests()
.anyRequest()
.authenticated();
}
}
当我请求例如:“/mgmt/health”时,系统会提示我进行基本身份验证,但登录后,(statePropagating,sso,clientContext)中的过滤器仍然会被应用 - 为什么会这样?
解决方案
如果我正确理解您的问题,您不希望应用过滤器,/mgmt
那么您可以使用
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) {
// Overridden to exclude some url's
web.ignoring().antMatchers("/mgmt");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
// configure the other url's as required
}
}
推荐阅读
- javascript - GUI 上 3 个顶点的方向
- c# - 如何使用 EPPlus 使用 ASP.Net 写入打开的 Excel 电子表格?
- c# - 仅当 Google+ 用户的图片在某个日期后发生更改时,如何下载该图片?
- python - 使用 Google OR 工具在类变量上添加约束
- c - 在文件中搜索单词并添加到计数
- lambda - Python在具有两个条件的嵌套列表中查找最小值
- python - 在导入时将变量传递给自写模块?
- c# - 尽管显然发生了碰撞,但 OnCollisionEnter2D 未激活
- flutter - 如何设置或移除按钮(RaisedButton)角半径?
- reactjs - 做出反应。导入 svg