【问题标题】:How to add a filter only for one special path WebSecurityConfigurerAdapter如何仅为一个特殊路径添加过滤器 WebSecurityConfigurerAdapter
【发布时间】:2018-01-30 21:38:25
【问题描述】:

我们的配置如下所示:

@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();
    }

并认识到我们在/logincall 内结束于FilteredOAuth2AuthenticationProcessingFilter,并问自己为什么会发生这种情况。

目标是让ssoFilterverifyingProcessingFilter 仅在到达路径api/**/* 的端点时应用。

现在我们必须在过滤器中添加一个 AntMatching 检查,因此它只应用于正确的请求,但我认为应该可以只将它添加到匹配的请求。

有人可以提供一个示例,说明如何将过滤器添加到一个特定的 Ant 匹配路径请求中吗?

【问题讨论】:

    标签: java spring web-services security spring-security


    【解决方案1】:

    看起来你不能用一个配置类来做到这一点。看看这个问题:How to apply spring security filter only on secured endpoints?

    在这种情况下,我认为更好的解决方案是配置多个HttpSecurity。来自Spring IO documentation

    我们可以配置多个 HttpSecurity 实例,就像我们可以拥有的一样 多个块。关键是延长 WebSecurityConfigurationAdapter 多次。例如, 以下是对 URL 进行不同配置的示例 以 /api/ 开头。

    文档中有一个完整的示例,其中包含完成此操作的必要步骤:

    1. 正常配置身份验证
    2. 创建一个 WebSecurityConfigurerAdapter 实例,其中包含 @Order 指定应该是哪个 WebSecurityConfigurerAdapter 优先考虑。
    3. http.antMatcher 声明此 HttpSecurity 仅适用于以 /api/ 开头的 URL
    4. 创建另一个 WebSecurityConfigurerAdapter 实例。如果 URL 不以 /api/ 开头,则将使用此配置。这 在 ApiWebSecurityConfigurationAdapter 之后考虑配置 因为它在 1 之后有一个 @Order 值(没有 @Order 默认为最后一个)。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2018-02-14
      • 1970-01-01
      • 2015-10-01
      • 2016-01-15
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多