我们的配置如下:
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
public static final String LOGIN_PATH_EXPRESSION = "/login";
public static final String API_PATH_EXPRESSION = "/api/**/*";
public static final String GLOBAL_PATH_EXPRESSION = "/**/*";
@Autowired
@Qualifier("ssoFilter")
private Filter ssoFilter;
@Autowired
private VerifyingProcessingFilter verifyingProcessingFilter;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.userDetailsService(username -> new User(username, "", Collections.emptyList()))
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers(LOGIN_PATH_EXPRESSION)
.authenticated()
.and()
.httpBasic()
.and()
.authenticationProvider(new SimpleAuthenticationProvider())
.authorizeRequests()
.antMatchers(API_PATH_EXPRESSION).authenticated()
.and()
.addFilterBefore(ssoFilter, BasicAuthenticationFilter.class)
.addFilterAfter(verifyingProcessingFilter, FilteredOAuth2AuthenticationProcessingFilter.class)
.authorizeRequests()
.antMatchers(GLOBAL_PATH_EXPRESSION)
.permitAll()
.and()
.csrf()
.disable();
}
并且认识到我们在FilteredOAuth2AuthenticationProcessingFilter
电话中/login
内部结束,并问自己为什么会这样。
目标是仅在使用路径ssoFilter
命中端点时应用verifyingProcessingFilter
和api/**/*
。
现在我们必须在过滤器内添加一个AntMatching检查,这样它才会应用于正确的请求,但我认为应该可以只将它添加到匹配的请求中。
有人可以举例说明如何将Filter添加到一个特定的Ant匹配路径请求中吗?
答案 0 :(得分:16)
看起来您无法使用单个Configuration类执行此操作。看一下这个问题:How to apply spring security filter only on secured endpoints?。
在这种情况下,我认为更好的解决方案是配置多个HttpSecurity。来自Spring IO documentation:
我们可以像我们一样配置多个HttpSecurity实例 多个块。关键是扩展 WebSecurityConfigurationAdapter多次。例如, 以下是对URL进行不同配置的示例 以/ api /.
开头
文档中有一个完整的示例,其中包含完成此任务的必要步骤:
祝你好运!
- 正常配置身份验证
- 创建包含的WebSecurityConfigurerAdapter实例 @Order指定应该是哪个WebSecurityConfigurerAdapter 首先考虑。
- http.antMatcher说明了这个HttpSecurity 仅适用于以/ api /
开头的网址- 创建WebSecurityConfigurerAdapter的另一个实例。如果URL不以/ api /开头,则将使用此配置。这个 在ApiWebSecurityConfigurationAdapter之后考虑配置 因为它在1之后有一个@Order值(没有@Order默认为最后一次)。
醇>