升级到Spring Boot 2.0.2后,Spring Security .permitAll()不再有效

时间:2018-06-11 08:17:51

标签: java spring spring-boot spring-security jwt

我使用的是一个向移动应用程序公开REST API的Web应用程序。我将我的Spring Boot版本从1.5.3.RELEASE升级到2.0.2.RELEASE,在修复了一些重大修改后,我面临一个我无法解决的问题。

我遵循了此Spring Boot 2.0 Migration GuideSpring Boot Security 2.0,并查看了Security changes in Spring Boot 2.0 M4

问题是该应用程序使用JWT身份验证,并且有一个端点(/ auth / login)接受用户凭据并生成一个长期存在的JWT作为回报。

有一个过滤器可以检查客户端发送的JWT令牌,并确定客户端是否可以访问所请求的资源。

自定义安全配置如下:

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled=true)
public class SecurityConfiguration {

@Configuration
@Order(1)
public class AuthenticationConfiguration extends WebSecurityConfigurerAdapter {

    // Some dependencies omitted

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                // we don't need CSRF because JWT token is invulnerable
                .csrf().disable()

                .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()

                // don't create session
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()

                .authorizeRequests()
                .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
                .antMatchers(HttpMethod.GET, "/version/**").permitAll()
                // Some more antMatchers() lines omitted
                .antMatchers("/auth/**").permitAll()
                .anyRequest().authenticated();

        // Custom JWT based security filter
        httpSecurity
                .addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class);

        // disable page caching
        httpSecurity.headers().cacheControl();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public JwtAuthenticationTokenFilter authenticationTokenFilterBean() throws Exception {
        return new JwtAuthenticationTokenFilter(jwtTokenUtil);
    }
}

@Configuration
@Order(2)
public class ClientVersionSupportConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry
                .addInterceptor(versionCheckingFilter())
                .addPathPatterns("/**")
                .excludePathPatterns("/error"); // Some more endpoints omitted
    }

    @Bean
    public VersionCheckingInterceptor versionCheckingFilter() {
        return new VersionCheckingInterceptor();
    }
}

}

请注意.antMatchers("/auth/**").permitAll()行。在没有JWT的情况下应该可以访问/auth个端点,因为当用户尚未登录时尚未生成JWT。

在升级Spring Boot之前,它工作正常,现在它无法运行。检查JWT的过滤器拒绝登录尝试。看起来.permitAll()没有让请求通过。 /version/**也不起作用。从浏览器中点击它会出现错误页面。

我还尝试从配置中删除行,直到剩下:

httpSecurity
        .authorizeRequests()
                .antMatchers("/auth/**").permitAll()

没有帮助。你能帮忙恢复原来的行为吗?

1 个答案:

答案 0 :(得分:1)

你有api的基本路径,例如/api

server.contextPath默认的Spring属性名称已更改为server.servlet.context-path

因此,如果您为api使用默认基本路径,则无法找到您期望的端点。除非您更新属性;)