春季安全。无法允许自定义装配工中的请求

时间:2018-09-21 12:37:44

标签: java spring spring-security

我需要使用特定的标头(例如“ sessionId”)来实现授权,并保护除一个以外的所有uri。

我扩展了OncePerRequestFilter并实现了自定义AuthenticationProvider,以检查sessionId是否有效(以及自定义令牌类等)。

现在如何工作:对于 any uri,它会在应用AuthSessionAuthenticationProvider之后立即跳至authenticate的{​​{1}}方法,如果标头{未指定{1}}。但是我希望某些uri允许不带该标头的访问。

这一切:

config:

AuthSessionFilter

过滤器:

sessionId

提供者:

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers(permittedUris).permitAll()
                .anyRequest().authenticated()
                .and().exceptionHandling().accessDeniedHandler(new AuthSessionAccessDeniedHandler())
                .and().addFilterBefore(new AuthSessionFilter(), BasicAuthenticationFilter.class);
    }

1 个答案:

答案 0 :(得分:0)

我发现了专门为此目的开发的更优雅的解决方案。 这是RequestHeaderAuthenticationFilter。然后antMatchers会按预期工作。初始配置如下所示:

    @Bean
    @SneakyThrows
    public RequestHeaderAuthenticationFilter preAuthenticationFilter() {
        RequestHeaderAuthenticationFilter preAuthenticationFilter = new RequestHeaderAuthenticationFilter();
        preAuthenticationFilter.setPrincipalRequestHeader(SESSION_ID);
        preAuthenticationFilter.setCredentialsRequestHeader(SESSION_ID);
        preAuthenticationFilter.setExceptionIfHeaderMissing(false);
        preAuthenticationFilter.setContinueFilterChainOnUnsuccessfulAuthentication(true);
        preAuthenticationFilter.setAuthenticationManager(authenticationManager());

        return preAuthenticationFilter;
    }