spring security permit仍然考虑在Authorization标头中传递令牌,如果令牌无效则返回401

时间:2016-03-29 23:21:32

标签: spring authentication spring-security spring-security-oauth2

我在我的项目中使用spring security oauth。我通过在Spring安全性ResourceServerConfigurerAdapter中配置来从身份验证中排除一些URL。我添加了http.authorizeRequests().antMatchers(url).permitAll()

现在,我所看到的是,如果我没有将Authorization标头传递给这些网址,则不会对其进行身份验证。并且API被正确调用。

如果使用Authorization标头进行调用,则会验证令牌并在未验证令牌时使调用失败。

我的问题是我需要做什么才能在我拥有permitAll的请求中忽略令牌。

2 个答案:

答案 0 :(得分:5)

Spring OAuth2将拦截所有带有标题的url:Authorization Bearer xxx。

避免Spring OAuth2拦截网址。我创建了一个SecurityConfiguration,其顺序高于Spring OAuth2配置。

@Configuration
@EnableWebSecurity
@Order(1) // this is important to run this before Spring OAuth2 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        List<RequestMatcher> requestMatchers = new ArrayList<RequestMatcher>();
        // allow /api/public/product/** and /api/public/content/** not intercepted by Spring OAuth2
        requestMatchers.add(new AntPathRequestMatcher("/api/public/product/**"));
        requestMatchers.add(new AntPathRequestMatcher("/api/public/content/**"));

    http
        .requestMatcher(new OrRequestMatcher(requestMatchers))
    .authorizeRequests()
      .antMatchers("/api/public/product/**", "/api/public/content/**").permitAll()
    }
}

上述配置允许/ api / public / product / **和/ api / public / content / **由此配置处理,而不是由Spring OAuth2处理,因为此配置具有更高的@Order。

因此,即使将无效令牌设置为上述api调用也不会导致无效的访问令牌。

答案 1 :(得分:3)

根据spring-oauth2文档https://projects.spring.io/spring-security-oauth/docs/oauth2.html

注意:如果您的授权服务器也是资源服务器,则存在另一个优先级较低的安全筛选器链,用于控制API资源。对于那些受访问令牌保护的请求,您需要它们的路径与面向用户的主过滤器链中的路径不匹配,因此请确保在上面的WebSecurityConfigurer中包括一个仅选择非API资源的请求匹配器。

因此,以比ResourceServerConfig更高的顺序定义WebSecurityConfigurer实现。