如何通过我的基本身份验证配置允许“/api/**”进入我在 Spring Security 中的 oauth 配置

Posted

技术标签:

【中文标题】如何通过我的基本身份验证配置允许“/api/**”进入我在 Spring Security 中的 oauth 配置【英文标题】:How to allow "/api/**" through my basic auth config and into my oauth config in Spring Security 【发布时间】:2017-06-26 13:57:56 【问题描述】:

我有一个同时使用 Basic Auth 和 OAuth2 的应用。

一些 URL 使用 Basic Auth 授权,而“/api/**”使用 OAuth2 授权。

目前,我有两个 Java 配置文件(WebSecurityConfigurerAdapterResourceServerConfigurerAdapter

每个配置文件都定义了一个public void configure(HttpSecurity http) 方法。

我遇到的问题是我需要一种优雅的方式来告诉我的应用在给定 url 请求的情况下是使用基本身份验证还是 oauth2。

目前我正在使用requestMatchers 来实现这一点:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter

  @Override
  protected void configure(HttpSecurity http) throws Exception
  
    http
      .csrf().disable()
    .requestMatchers()
      .antMatchers("/*", "/login/**", "/reviews/**")
    .and()
    .authorizeRequests()
      .antMatchers("/*").permitAll()
      .antMatchers("/js/**").permitAll()
      .antMatchers("/img/**").permitAll()
    .formLogin()
      .loginPage("/login")
      .successHandler(loginSuccessPostHandler)
      .permitAll()
      .and()
    .logout()
      .logoutSuccessUrl("/").permitAll()
      .and()
    .apply(getSpringSocialConfigurer());
  


@Configuration
public class OAuth2ServerConfig

  @Configuration
  @EnableResourceServer
  protected static class Oauth2ServerConfig extends ResourceServerConfigurerAdapter
  
    @Override
    public void configure(HttpSecurity http) throws Exception
    
      http.httpBasic().disable();
      http.csrf().disable();

      http.requestMatchers()
        .antMatchers("/api/**")
        .and()
      .authorizeRequests()
        .antMatchers("/api/v1/**").access("#oauth2.hasScope('read')");  
    
  

问题是,每次我添加一个不是“/api/**”的新 URL 时,我都需要将它添加到我的 WebSecurityConfig 的 requestMatcher 部分......这可能会导致愚蠢的错误未来。

有没有一种方法可以基于负前瞻正则表达式进行 requestMatcher 搜索?我使用正则表达式进行了尝试:^(?!/api),但由于它实际上并没有返回 MATCH,而只返回“find == true”,所以它似乎没有完成工作。

有什么想法/建议吗?

【问题讨论】:

【参考方案1】:

你可以使用NegatedRequestMatcher:

一个RequestMatcher,它将否定传入的RequestMatcher。例如,如果传入的RequestMatcher返回true,则NegatedRequestMatcher将返回false。如果传入的RequestMatcher返回false,NegatedRequestMatcher会返回true。

【讨论】:

【参考方案2】:

您应该在@Configuration 类上使用Order(...) 注释。首先配置您的 OAuth2ServerConfig 并仅提供 http.requestMatchers().antMatchers("/api/**") 并让您的 WebSecurityConfig 第二 (@Order(2)) 没有 http.requestMatchers() 以提供所有其余 URL!

查看https://***.com/a/44871933/173149的详细信息

【讨论】:

以上是关于如何通过我的基本身份验证配置允许“/api/**”进入我在 Spring Security 中的 oauth 配置的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 YAML、tavern 和 pytest 使用基本身份验证测试 API

使用 OAuth 保护我的 REST API,同时仍然允许通过第三方 OAuth 提供程序进行身份验证(使用 DotNetOpenAuth)

从 Alexa 向 API 进行身份验证

如何在 Spring Boot 中设计两个单独的授权/身份验证配置?

Azure 授权 - 让未经身份验证的用户调用 api

如何验证快速API以仅允许登录用户